Я рассматривал универсальный / отменяемый интерфейс общего назначения для асинхронных запросов / ответов. Требования следующие, оно должно:
- Поддержка асинхронных вызовов
- Быть отменяемым
- Будьте родовым
- Запрос поддержки / ответ
- Поддержка либо возврата в текущем потоке, либо обработки ответа в другом ответе
Итак, вот мой первый удар:
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 (и onFinally?) В AsyncCallback, но это сделает его еще более подробным
В некоторых случаях методы сервиса Google Protocol Buffers следуют относительно схожей модели:
void [methodname](RpcController controller,
[RequestClass] request, RpcCallback<[ResponseClass]> callback);
Есть идеи получше?