Проблема Axis2 с одновременными запросами несоответствующего объекта ответа - PullRequest
2 голосов
/ 21 июля 2011

Я столкнулся с проблемой на моем производственном сервере для веб-службы с параллельными запросами.

Проблема заключается в том, что когда веб-служба получает (например) два запроса на два разных метода (каждый метод возвращаетдругой объект) в том же сервисе, веб-служба будет возвращать тип объекта второго запроса.

Для простого и простого воспроизведения проблемы я создаю простой веб-сервис только с одним сервисом и двумя методами с одинаковымсреда производственного сервера.

Код ( RequestMethods.class )

package test;

import beans.Request1Response;
import beans.Request2Response;

public class RequestMethods {

    public Request1Response request1() {
        Request1Response output = new Request1Response();

        try {
            Thread.sleep(10 * 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        output.setError_code(1);
        output.setError_msg("message1");

        return output;
    }

    public Request2Response request2() {
        Request2Response output = new Request2Response();

        output.setError_code(2);
        output.setError_msg("message2");

        return output;
    }

}

Конфигурации ( services.xml )

<service name="RequestMethods">
    <Description>
        Concurrent Requests test
    </Description>
    <messageReceivers>
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
        <messageReceiver  mep="http://www.w3.org/2004/08/wsdl/in-out"  class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
    </messageReceivers>
    <parameter name="ServiceClass" locked="false">test.RequestMethods</parameter>
</service>

Тест

Я сделал запрос на request1 и, прежде чем он вернется, сделал еще один запрос на request2 .

Результат для request1 (первый запрос, но второй полученный ответ):

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <ns:request2Response xmlns:ns="http://test/xsd">
         <ns:return>
            <error_code xmlns="http://beans/xsd">1</error_code>
            <error_msg xmlns="http://beans/xsd">message1</error_msg>
         </ns:return>
      </ns:request2Response>
   </soapenv:Body>
</soapenv:Envelope>

Результат для request2 (второй запрос, кромепервый полученный ответ):

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <ns:request2Response xmlns:ns="http://test/xsd">
         <ns:return>
            <error_code xmlns="http://beans/xsd">2</error_code>
            <error_msg xmlns="http://beans/xsd">message2</error_msg>
         </ns:return>
      </ns:request2Response>
   </soapenv:Body>
</soapenv:Envelope>

Как вы можете видеть выше, ответ для request1 должен быть типа request1Response , но он request2Response *Вместо 1040 *.

Я использую следующую среду:

  • Tomcat 5.5.25 для сервера приложений
  • Axis2 1.2 для веб-службы
  • Java версия 1.5.0_11

Кто-нибудь также сталкивался с этой проблемой или знает, как ее решить?Я уже пытался изменить версию Axis2 на 1.6, но проблема сохраняется.

Любая помощь приветствуется.

С уважением, João

1 Ответ

1 голос
/ 29 июля 2011

Нашел решение для этой проблемы.

Если у вас есть служба ( RequestMethods ) с более чем одним определенным методом ( request1 и request2 ), необходимо установить один RPCMessageReceiver для каждого метода, чтобы избежать проблем с параллелизмом.

Вы можете определить один MessageReceiver для каждого метода в файле services.xml .

В примере, который я публикую, файл services.xml должен выглядеть следующим образом:

services.xml

<service name="RequestMethods">
    <Description>
        Concurrent Requests test
    </Description>
    <operation name="request1"> 
        <messageReceiver  mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/> 
    </operation>
    <operation name="request2"> 
        <messageReceiver  mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/> 
    </operation> 
    <parameter name="ServiceClass" locked="false">test.RequestMethods</parameter>
</service>
...