Сгенерированные Axis2 заглушки являются потокобезопасными? - PullRequest
4 голосов
/ 12 мая 2011

Являются ли заглушки, сгенерированные WSDL2JAVA (с помощью опции привязки XMLBeans) через Axis2 1.5.4, потокобезопасными?

На самом деле я создал одну заглушку для веб-службы, которую я вызываю через несколько потоков.Я настроил свой собственный MultiThreadedHttpConnectionmanager и также установил HTTPConstants.REUSE_HTTP_CLIENT, но я вижу некоторые исключения NullPointerException в stub._getServiceClient().cleanupTransport, которые я вызываю после каждого вызова.

Иногда темы тоже зависают.

В то же время я заметил, что в сгенерированном заглушке в методе работы Web-сервиса cleanup () вызывается уже в блоке finally.Не следует ли мне потом самому позвонить stub._getServiceClient().cleanupTransport

Мой код:

        httpConnMgr = new MultiThreadedHttpConnectionManager();
        HttpConnectionManagerParams params = httpConnMgr.getParams();
        if (params == null) {
            params = new HttpConnectionManagerParams();

        }
        params.setDefaultMaxConnectionsPerHost(numberOfThreads);
        httpConnMgr.setParams(params);
        HttpClient httpClient = new HttpClient(httpConnMgr);

        service = new Service1Stub(this.endPointAddress);
        service._getServiceClient().getOptions()
                .setTimeOutInMilliSeconds(this.timeOut);
        service._getServiceClient().getOptions()
                .setProperty(HTTPConstants.REUSE_HTTP_CLIENT, Boolean.TRUE);
        service._getServiceClient().getOptions()
        .setProperty(HTTPConstants.AUTO_RELEASE_CONNECTION, Boolean.FALSE);
        service._getServiceClient()
                .getOptions()
                .setProperty(HTTPConstants.SO_TIMEOUT, (int) (this.timeOut));
        service._getServiceClient()
                .getOptions()
                .setProperty(HTTPConstants.CONNECTION_TIMEOUT,
                        (int) (this.timeOut));
        service._getServiceClient().getServiceContext().getConfigurationContext()
                .setProperty(HTTPConstants.CACHED_HTTP_CLIENT, httpClient);

Тем временем в сгенерированной заглушке я заметил, что cleanUp уже вызывается:

   finally {
            _messageContext.getTransportOut().getSender().cleanup(_messageContext);
        }

Любое предложение будет очень полезным.Спасибо.

1 Ответ

7 голосов
/ 14 мая 2011

Когда я некоторое время назад изучал Axis2, у меня также были вопросы, связанные с безопасностью потоков.

Найти информацию о безопасности потоков Axis2 было сложно, но я, наконец, столкнулся со следующей проблемой Jira: https://issues.apache.org/jira/browse/AXIS2-4357

Упоминается, что:

Клиентская сторона Axis2 не является поточно-ориентированной, и с самого начала проекта [...] использовались разные заглушки дляразные темы [...]

Сама проблема закрыта со статусом Won't Fix и следующим примечанием:

Заглушки Axis2 не являются поточно-ориентированными.Как указал Дипал, это сделано по замыслу.

Это было сделано для меня в то время.

В основном вам нужно использовать одну заглушку на поток, или вы можете использовать пул заглушек как (если я правильно помню) заглушкиможет быть использован повторно (но все же необходимо использовать одну заглушку на поток, чтобы избежать каких-либо проблем).Другие, кажется, с успехом использовали пулы заглушек ( см. Связанный вопрос SO здесь ).

Один совет, который я обычно следую в отношении безопасности потоков: Если явно не указано, что что-топотокобезопасен, тогда предположим, что это не .

...