Domanda

Ho un proxy WSO2 ESB-4.6.0 che chiama un altro proxy che chiama un server web.

Proxy1 --> Proxy2 --> Endpoint
.

Se chiamò direttamente il secondo proxy tramite Soapui, la risposta è restituita correttamente e stampata, ma se chiamo il primo proxy, viene restituito un corpo vuoto.

Nel registro ESB, il risultato del Proxy1 è stampato prima della verifica del proxy2. Sembra che il Mediatore di invio presente nella informazione del proxy1 stia facendo una chiamata asincrona al proxy2.
Ho provato a sostituire il mediatore di invio con il mediatore del callout, ma il risultato è lo stesso.
Segui questo tutorial, ma non funzionava anche.

Come inoltrare la risposta per il proxy2 al chiamante?
Per favore aiuto. Mi sta uccidendo!

Modifica

Problema risolto! Stavo usando una porta sbagliata per specificare il parametro ServiceURL per il mediatore del callout.

Modifica

La configurazione dei proxy attuali:

Proxy1 (Calling Proxy 2 - Manageworkforce):

<proxy xmlns="http://ws.apache.org/ns/synapse" name="GetAppointmentSchedulePortalReqCS" transports="http https" startOnLoad="true" trace="disable">
    <target>
        <inSequence>
            <xslt key="conf:ManageWorkforce/xslt/GetAppointmentSchedulePortalReqCS_Request.xsl"/>
            <header name="Action" value="getAppointment"/>
            <send>
                <endpoint>
                    <address uri="https://localhost:9443/services/ManageWorkforce"/>
                </endpoint>
            </send>
        </inSequence>
        <outSequence>
            <xslt key="conf:ManageWorkforce/xslt/GetAppointmentSchedulePortalReqCS_Response.xsl"/>
            <send/>
        </outSequence>
        <faultSequence/>
    </target>
    <publishWSDL key="conf:ManageWorkforce/GetAppointmentSchedulePortalReqCS.wsdl" />
</proxy>
.

Proxy 2 (Calling Proxy3 -GetAppointmentPeopleProvcs):

<proxy xmlns="http://ws.apache.org/ns/synapse" name="ManageWorkforce" transports="https http" startOnLoad="true" trace="disable">
    <target>
        <inSequence>
            <switch source="get-property('Action')">
                <case regex="getAppointment">
                    <callout serviceURL="https://localhost:8243/services/GetAppointmentPeopleProvCS" action="getAppointment">
                        <source xmlns:s12="http://www.w3.org/2003/05/soap-envelope" xmlns:s11="http://schemas.xmlsoap.org/soap/envelope/" xpath="s11:Body/child::*[fn:position()=1] | s12:Body/child::*[fn:position()=1]"/>
                        <target xmlns:s12="http://www.w3.org/2003/05/soap-envelope" xmlns:s11="http://schemas.xmlsoap.org/soap/envelope/" xpath="s11:Body/child::*[fn:position()=1] | s12:Body/child::*[fn:position()=1]"/>
                    </callout>
                </case>
                <!-- another cases -->
                <default/>
            </switch>
            <property name="RESPONSE" value="true" scope="default" type="STRING"/>
            <header name="To" action="remove"/>
            <send/>
        </inSequence>
        <outSequence>
            <drop/>
        </outSequence>
        <faultSequence/>
    </target>
    <publishWSDL key="conf:ManageWorkforce/ManageWorkforce.wsdl"/>
    </publishWSDL>
</proxy>
.

Proxy 3 (chiamando il servizio -Gappointment):

<proxy xmlns="http://ws.apache.org/ns/synapse" name="GetAppointmentPeopleProvCS" transports="http https" serviceGroup="" startOnLoad="true" trace="disable">
    <target>
        <endpoint key="GetAppointment"/>
        <inSequence>
            <xslt key="conf:ManageWorkforce/xslt/GetAppointmentPeopleProvCS_Request.xsl"/>
        </inSequence>
        <outSequence>
            <xslt key="conf:ManageWorkforce/xslt/GetAppointmentPeopleProvCS_Response.xsl"/>
            <send/>
        </outSequence>
        <faultSequence/>
    </target>
</proxy>
.

Endpoint finale (servizio):

<endpoint xmlns="http://ws.apache.org/ns/synapse" name="GetAppointment">
    <address uri="http://10.13.6.75:9764/services/GetAppointment" />
</endpoint>
.

È stato utile?

Soluzione

Ci sono due mediatori per invocare i servizi Web.Quelli sono Mediator di callout e Mediatore di chiamata .Il mediatore del callout esegue una chiamata di blocco e il mediatore di chiamata esegue una chiamata non bloccante.

Quindi, dovresti usare il mediatore delle chiamate se si considera la performance.È disponibile in ESB 4.8.0.

Ci sono due campioni per questi in Wiki Docs.

.

C'è un altro Esempio per la chiamataMediatore dal blog di Dushan.Questo ha mediatori più complessi, ma puoi provare.

Questa è solo una risposta rapida.

Spero che questo aiuti.

Grazie!

Altri suggerimenti

Proxy1 Aspetta la risposta da Proxy2 anche tu usi il mediatore di invio. OSSUQUENZA DEL PROXY1 non deve essere eseguito prima dell'esecuzione della verifica della verifica del proxy2.

Passa al callout Mediator è non la soluzione ideale per questo. Penso che ci dovrebbe essere qualcosa di sbagliato nella configurazione proxy.

Se è possibile postare la configurazione proxy qui, potremmo essere in grado di darti un aiuto per risolvere questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top