Вызов службы ASYNC клиента JAX-WS с использованием WLS 10.3.3 - PullRequest
1 голос
/ 25 июня 2010

Я пишу интеграционный веб-сервис, который будет использовать различные веб-сервисы из нескольких разных бэкэнд-систем.Я хочу иметь возможность распараллеливать независимые сервисные вызовы и иметь возможность отменять запросы, которые занимают слишком много времени (поскольку у меня есть 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("");
    }
}  

Я ожидаю, что все эти запросы будут в конечном итоге отменены, однако в действительности все они продолжают выполняться ивозвращать только тогда, когда сервер наконец решит отправить нам ответ.

1 Ответ

0 голосов
/ 10 марта 2011

Как оказалось, это действительно было ошибкой в ​​реализации jax-ws. Oracle выпустила Патч (RHEL) против wls 10.3.3 для решения этой проблемы.

...