我一直在考虑异步请求/响应的通用/可取消接口。要求如下:
支持异步调用
可取消
一般的
支持请求/响应
支持在当前线程中返回或在另一个响应中处理响应
这是我的第一次尝试:
interface AsyncOperation<INPUT, OUTPUT> {
Future<OUTPUT> execute(INPUT in, AsyncCallback<OUTPUT> callback);
}
interface AsyncCallback<OUTPUT> {
void done(OUTPUT output);
}
用法:
// completely async operation
operation.execute("Test", new AsyncCallback<String> {
public void done(String output) {
// process result...
}
});
// sync operation with cancellation after timeout
Future<String> future = operation.execute("Test", null);
try {
String result = future.get(1000);
} catch(TimeoutException ex) {
future.cancel();
}
缺点
很复杂
它只支持一个请求参数——不太关心这个
单个“done”意味着异常必须通过“done”进行通信,这可以通过onsuccess和onexception(和onfinally?)来解决。在AsyncCallback中,但它会使它更加冗长
对于某些上下文,google protocol buffers服务方法遵循一个相对类似的模型:
void [methodname](RpcController controller,
[RequestClass] request, RpcCallback<[ResponseClass]> callback);
有更好的主意吗?
最佳答案
是否需要输入类型参数?操作对象将输入保持为状态会更容易吗,如:
void greet(final String name) {
new AsyncOperation<Object>() {
@Override Object doIt() {
System.out.println("Hello " + name + "!");
}
}.execute(null);
}
这样,调用者可以以类型安全的方式传递任意多个参数。
此外,调用回调并返回未来似乎是一种奇怪的用法。你确定你需要吗?您可以提供两个执行方法,一个返回未来,另一个调用回调。
关于java - 设计通用的可取消异步操作接口(interface),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3696156/