Я пишу интеграционный веб-сервис, который будет использовать различные веб-сервисы из нескольких разных бэкэнд-систем.Я хочу иметь возможность распараллеливать независимые сервисные вызовы и иметь возможность отменять запросы, которые занимают слишком много времени (поскольку у меня есть SLA для удовлетворения).
для помощи в параллельных внутренних вызовах, я использую ASYNCклиентский apis (сгенерированный wsimport с использованием клиентских файлов изменений привязки jax-ws)
проблема, с которой я сталкиваюсь, заключается в том, что при попытке отменить запрос Response <> соответствующим образом помечает запрос как отмененныйоднако фактический запрос на самом деле не отменен.очевидно, некоторая часть среды выполнения JAX-WS фактически отправляет com.sun.xml.ws.api.pipe.Fiber в очередь выполнения, которая фактически выполняет запрос.Отмена в результате <> не препятствует выполнению этих PIPE в очереди и выполнению запроса.
Кто-нибудь сталкивался с этой проблемой или подобной проблемой раньше?
Мой код выглядит следующим образом:
List<Response<QuerySubscriberResponse>> resps = new ArrayList<Response<QuerySubscriberResponse>>();
for (int i = 0; i < 10; i++) {
resps.add(FPPort.querySubscriberAsync(req));
}
for (int i = 0; i < 10; i++) {
logger.info("Waiting for " + i);
try {
QuerySubscriberResponse re = resps.get(i).get(1,
TimeUnit.SECONDS); // execution time for this request is 15 seconds, so we should always get a TimeoutException
logger.info("Got: "
+ new Marshaller().marshalDocumentToString(re));
} catch (TimeoutException e) {
logger.error(e);
logger.error("Cancelled: " + resps.get(i).cancel(true));
try {
logger.info("Waiting for my timed out thing to finish -- technically I've canceled it");
QuerySubscriberResponse re = resps.get(i).get(); // this causes a CancelledExceptio as we would expect
logger.info("Finished waiting for the canceled req");
} catch (Exception e1) {
e1.printStackTrace();
}
} catch (Exception e) {
logger.error(e);
} finally {
logger.info("");
logger.info("");
}
}
Я ожидаю, что все эти запросы будут в конечном итоге отменены, однако в действительности все они продолжают выполняться ивозвращать только тогда, когда сервер наконец решит отправить нам ответ.