Веб-служба SOAP с ActiveMQ дает странный ответ

У меня есть Mule Flow, который предоставляет веб-службу SOAP: -

<jms:activemq-connector name="Active_MQ" brokerURL="tcp://localhost:61616" validateConnections="true" doc:name="Active MQ"/>

<flow name="Flow1" doc:name="Flow1" >
<http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8082" path="mainData" doc:name="HTTP"/>
<cxf:jaxws-service serviceClass="com.test.services.schema.maindata.v1.MainData"  doc:name="SOAP"/>
<mulexml:object-to-xml-transformer doc:name="Object to XML"/>
<jms:outbound-endpoint queue="NewQueue" connector-ref="Active_MQ" doc:name="JMS" exchange-pattern="request-response"/>
<logger message="Response2 :- #[message.payload]" level="INFO" doc:name="Logger"/>
<mulexml:xml-to-object-transformer doc:name="XML to Object"/>
</flow>


<flow name="flow2" doc:name="flow2" >
<jms:inbound-endpoint connector-ref="Active_MQ" address="jms://tcp:NewQueue" doc:name="JMS" exchange-pattern="request-response" disableTemporaryReplyToDestinations="true" responseTimeout="90000"/>
<set-variable variableName="SOAPRequest" value="#[message.payload]" doc:name="Variable"/>
<mulexml:xml-to-object-transformer doc:name="XML to Object"/>
<component class="com.test.services.schema.maindata.v1.Impl.MainDataImpl" doc:name="JavaMain_ServiceImpl">
<method-entry-point-resolver>
        <include-entry-point method="retrieveDataOperation"/>
        <include-entry-point method="insertDataOperation"/>
        <include-entry-point method="updateDataOperation"/>
        <include-entry-point method="deleteDataOperation"/>
</method-entry-point-resolver>
</component>
<mulexml:object-to-xml-transformer doc:name="Object to XML"/>
 </flow>

Теперь в веб-сервисе есть 4 метода: - retrieveDataOperation (), insertDataOperation (), updateDataOperation () и deleteDataOperation () в классе MainDataImpl .. Все методы имеют разные ответные сообщения ... Но странно то, что если я протестируйте приложение в пользовательском интерфейсе SOAP. Я обнаружу, что и операция insertDataOperation (), и updateDataOperation () дают одинаковый ответ, хотя в классе MainDataImpl оба ответа различаются. Я не знаю, почему метод updateDataOperation () показывает ответ из insertDataOperation () ..

Я подозреваю, что в текущем потоке я использовал следующее:

<component class="com.test.services.schema.maindata.v1.Impl.MainDataImpl" doc:name="JavaMain_ServiceImpl">
<method-entry-point-resolver>
        <include-entry-point method="retrieveDataOperation"/>
        <include-entry-point method="insertDataOperation"/>
        <include-entry-point method="updateDataOperation"/>
        <include-entry-point method="deleteDataOperation"/>
</method-entry-point-resolver>
</component>

Мой файл xsd выглядит следующим образом: -

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://services.test.com/schema/MainData/V1" xmlns:tns="http://services.test.com/schema/MainData/V1" elementFormDefault="qualified">


    <complexType name="dataRequest">
        <sequence>
            <element name="Id" type="int"></element>
            <element name="Name" type="string"></element>
            <element name="Age" type="int"></element>
            <element name="Designation" type="string"></element>
        </sequence>
    </complexType>

    <complexType name="dataResponse">
        <sequence>
            <element name="Response" type="string"></element>
            <element name="Id" type="int"></element>
            <element name="Name" type="string"></element>
            <element name="Age" type="int"></element>
            <element name="Designation" type="string"></element>
        </sequence>
    </complexType>

    <element name="insertDataRequest" type="tns:dataRequest"></element>

    <element name="insertDataResponse" type="tns:dataResponse"></element>


    <element name="retrieveDataRequest" type="tns:retrieveRequest"></element>

    <element name="retrieveDataResponse" type="tns:dataResponse"></element>

    <complexType name="retrieveRequest">
        <sequence>
            <element name="Id" type="int"></element>
        </sequence>
    </complexType>

    <element name="updateDataRequest" type="tns:dataRequest"></element>

    <element name="updateDataRespone" type="tns:dataResponse"></element>

    <complexType name="deleteRequest">
        <sequence>
            <element name="ID" type="int"></element>
        </sequence>
    </complexType>

    <element name="deleteDataRequest" type="tns:deleteRequest"></element>

    <element name="deleteDataResponse" type="tns:dataResponse"></element>
</schema>

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


person Anirban Sen Chowdhary    schedule 22.08.2014    source источник


Ответы (2)


Я не думаю, что method-entry-point-resolver вообще полезен: Mule может найти эти 4 метода автоматически.

Основная проблема возникает из-за того, что и insertDataOperation, и updateDataOperation получают объект одного и того же типа (DataRequest); в то время как retrieveDataRequest получает RetrieveRequest, а deleteDataOperation получает DeleteRequest.

Можете ли вы изменить WSDL так, чтобы insertDataOperation и updateDataOperation получали определенные типы?

Если нет, то вам придется перенести от потока 1 к потоку 2 имя фактического метода, вызываемого в компоненте, на основе переменных потока, которые создает CXF (method, cxf_operation и cxf_service).

Вы также можете использовать invoke обработчик сообщений вместо component, чтобы упростить контроль над вызываемым методом.

person David Dossot    schedule 22.08.2014
comment
Привет, Дэвид ... одно сомнение ... как я могу попасть в cxf_operation .. Я планировал сохранить вызываемый метод в переменной, а затем использовать переменную в ‹include-entry-point method = here имя переменной .. - person Anirban Sen Chowdhary; 23.08.2014
comment
Есть ли способ получить имя метода в потоке 1 из CXF и сохранить его, чтобы я мог использовать эту переменную в потоке 2 и использовать в компоненте Java для ее вызова? - person Anirban Sen Chowdhary; 23.08.2014

Итак, согласно предложению Дэвида, рабочее решение устанавливает имя метода в свойстве

 <set-property propertyName="methodName" value="#[cxf_operation.localPart]" doc:name="methodNameProperty"/>

а затем вызвать его в классе реализации Java: -

<component class="com.test.services.schema.maindata.v1.Impl.MainDataImpl" doc:name="Java">
    <property-entry-point-resolver property="methodName"/> 
 </component>
person Anirban Sen Chowdhary    schedule 22.07.2015