我有一个 WSO2 ESB-4.6.0 代理,它调用另一个调用 Web 服务的代理。
Proxy1 --> Proxy2 --> Endpoint
如果我通过soapUI直接调用第二个代理,响应会正确返回并打印,但如果我调用第一个代理,则会返回空白正文。
在ESB日志中,Proxy1的outSequence打印在Proxy2的outSequence之前。
似乎 Proxy1 的 inSequence 中存在的发送中介正在对 Proxy2 进行异步调用。
我尝试用 Callout 中介器替换 Send 中介器,但结果是相同的。
按照this教程进行操作,但它也不起作用。
如何将Proxy2的响应转发给调用者?
请帮忙。快要死我了!
编辑
问题解决了!我使用了错误的端口来为 Callout 中介器指定 serviceURL 参数。
编辑
当前代理配置:
代理 1(调用代理 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>
代理 2(调用代理 3 -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>
代理3(调用服务-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>
最终端点(服务):
<endpoint xmlns="http://ws.apache.org/ns/synapse" name="GetAppointment">
<address uri="http://10.13.6.75:9764/services/GetAppointment" />
</endpoint>
有两个中介器来调用 Web 服务。它们是Callout Mediator 和Call Mediator。 Callout 中介器执行阻塞调用,而 Call Mediator 执行非阻塞调用。
因此,如果考虑性能,您应该使用 Call mediator。它在 ESB 4.8.0 中可用。
维基文档中有两个样本。
Dushan 博客中还有另一个 Call Mediator sample。这有更复杂的中介,但你可以尝试一下。
这只是一个快速回答。
我希望这有帮助。
谢谢!
即使您使用发送中介,Proxy1 也会等待 Proxy2 的响应。 Proxy1 的 outSequence 不应在 Proxy2 的 outSequence 执行之前执行。
切换到 Callout Mediator 不是是解决此问题的理想解决方案。 我认为代理配置应该有问题。
如果您可以在此处发布代理配置,我们也许可以帮助您解决此问题。
发送中介器对您通知的指定 URI 执行非阻塞请求,然后根据您从请求中获得的响应将您重定向到 outSequence(成功)或错误序列(错误)。如果您想在向特定 URI 发出请求后保留在 inSequence 中,您可以使用 Call Mediator 来代替。