我一直在考虑异步请求/响应的通用/可取消接口。要求如下:
支持异步调用
可取消
一般的
支持请求/响应
支持在当前线程中返回或在另一个响应中处理响应
这是我的第一次尝试:

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/

10-13 06:43