Вы можете использовать Future для доступа к вашим нисходящим сервисам, а затем использовать какой-то подход, основанный на событиях, для обработки успеха / тайм-аутов.
public interface ICallback {
public void onSuccess(DsObject object);
public void onTimeout();
}
Способ доступа к вашим нисходящим сервисамможет выглядеть так:
public class DownstreamConnector implements Callable<DsObject> {
@Override
public DsObject call() {
// Invoke your downstream services here
return ...
}
}
Затем вы можете обернуть вызываемый элемент в Future<>
, чтобы вызвать ваши нисходящие сервисы и проверить время ожидания.
final ICallback callback = new MyCallbackHandler();
final DownstreamConnector connector = new DownstreamConnector()
ExecutorService executor = ...
Future<DsObject> future = executor.submit(connector);
try {
DsObject result = future.get(TIMEOUT, TimeUnit.MILISECONDS);
// Operation completed
callback.onSuccess(result);
} catch (TimeoutException ex) {
logger.error("Operation timed out", ex);
future.cancel(true);
// Timed out
callback.onTimeout();
}
Просто комментарий: future.cancel(true);
действительно не останавливает выполняющуюся базовую задачу, он просто устанавливает для флага прерывания значение true для запущенного потока.Именно ваш код отвечает за проверку этого флага и выдаёт InterruptedException
, если это правда.