Pergunta

Tenho um proxy WSO2 ESB-4.6.0 que chama outro proxy que chama um webservice.

Proxy1 --> Proxy2 --> Endpoint

Se eu chamar diretamente o segundo proxy via soapUI, a resposta será retornada e impressa corretamente, mas se eu chamar o primeiro proxy, um corpo em branco será retornado.

No log ESB, o outSequence do Proxy1 é impresso antes do outSequence do Proxy2.Parece que o mediador Send presente no inSequence do Proxy1 está fazendo uma chamada assíncrona para o Proxy2.
Tentei substituir o mediador Send pelo mediador Callout, mas o resultado é o mesmo.
Seguir esse tutorial, mas também não funcionou.

Como encaminhar a resposta do Proxy2 para o chamador?
Por favor ajude.Está me matando!

EDITAR

Problema resolvido!Eu estava usando uma porta errada para especificar o parâmetro serviceURL para o mediador Callout.

EDITAR

A configuração atual dos proxies:

Proxy1 (chamando 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 (chamando 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 (chamando o serviço -GetAppointment):

<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>

Ponto final final (serviço):

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

Solução

Existem dois mediadores para invocar serviços da web.Esses são Mediador de chamadas e Mediador de chamadas.O mediador de Callout realiza uma chamada bloqueadora e o Mediador de Chamada executa uma chamada sem bloqueio.

Portanto, você deve usar o mediador de chamada se considerar o desempenho.Está disponível no ESB 4.8.0.

Existem dois amostras para estes em documentos wiki.

Tem outro amostra para Call Mediator do blog de Dushan.Isso tem mediadores mais complexos, mas você pode experimentar.

Esta é apenas uma resposta rápida.

Eu espero que isso ajude.

Obrigado!

Outras dicas

O Proxy1 aguarda a resposta do Proxy2 mesmo que você use o mediador de envio.outSequence do Proxy1 não deve ser executado antes da execução de outSequence do Proxy2.

Mudar para o Callout Mediator é não a solução ideal para isso.Acho que deve haver algo errado com a configuração do proxy.

Se você puder postar a configuração do proxy aqui, poderemos ajudá-lo a resolver isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top