我一直在考慮一個用於異步請求/響應的通用通用/可取消接口。的要求如下,它必須:設計一個通用的可取消異步操作接口
- 支持異步調用
- 成爲撤銷
- 是通用
- 支持請求/響應
- 支持任一返回在當前線程或處理在該響應另一個迴應
所以這裏是我的第一個刺:
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();
}
缺點
- 它的複雜
- 它僅支持單個請求參數 - 不用太在意這個
- 單 '完成'意味着異常必須通過'完成'來傳達,這可以通過使用onSuccess和onException(和onFin ?盟友)中的AsyncCallback,但它會使它更加詳細
對於某些情況下,谷歌協議緩衝器服務方法遵循一個相對類似的模式:
void [methodname](RpcController controller,
[RequestClass] request, RpcCallback<[ResponseClass]> callback);
更好的想法?
你正確的,回調和返回未來有點奇怪,但它支持取消用例以及您可能想說的等待5秒的情況,如果操作完成返回操作的結果,如果不是,只是返回它是'忙處理'。該回調然後執行結果的實際處理。 – 2010-09-12 19:32:04
狡猾的計劃擺脫了輸入參數限制。我記住的用例是能夠創建AsyncOperation的泛型實現,它們可以限制/限制使用的線程數量等。 – 2010-09-12 19:35:36