왜 WSO2를 보내는 중재자가 응답을 기다리지 않는 이유는 무엇입니까?
문제
WebService를 호출하는 다른 프록시를 호출하는 WSO2 ESB-4.6.0 프록시가 있습니다.
Proxy1 --> Proxy2 --> Endpoint
.
SOAPUI를 통해 두 번째 프록시를 직접 호출하면 응답이 올바르게 반환되고 인쇄되지만 첫 번째 프록시를 호출하면 빈 본문이 반환됩니다.
ESB 로그에서 PROXY1의 초고는 PROXY2의 출고 전에 인쇄됩니다.
PROXY1의 즉시 PROXY2의 인후에있는 보낸 중재자가 PROXY2에 비동기식 호출을하는 것처럼 보입니다.
콜 아웃 중재자가 보내는 중재자를 교체하려고했지만 결과는 동일합니다.
이를 따릅니다 튜토리얼. 그러나 그것은 또한 작동하지 않았습니다.
PROXY2에 대한 응답을 호출자에게 전달하는 방법은 무엇입니까? 도와주세요. 그것은 나를 죽이고 있습니다!
편집
문제 해결! 콜 아웃 중재자를위한 ServiceURL 매개 변수를 지정하려면 잘못된 포트를 사용하고있었습니다.
편집
현재 프록시 구성 :
Proxy1 (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>
.
프록시 2 (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>
.
프록시 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>
. 해결책
웹 서비스를 호출하는 두 가지 중재자가 있습니다.그것들은 콜 아웃 중재자 및 Call Mediator .콜 아웃 중재자는 차단 호출을 수행하고 호출 중재자는 차단되지 않는 호출을 수행합니다.
그래서 성능에 대해 고려하면 통화 중재자를 사용해야합니다.ESB 4.8.0에서 Availble입니다.
두 개의 샘플
또 다른 샘플 Dushan의 블로그의 중재자.이것은 더 복잡한 중재자를 가지고 있지만 시도 할 수 있습니다.
이것은 빠른 답변 일뿐입니다.
이 도움이되기를 바랍니다.
감사합니다!
다른 팁
PROXY1은 PROXY2의 응답을 대기합니다. 송신 중재자를 사용하십시오. PROXY1의 출고는 PROXY2의 즉시 실행을 실행하기 전에 실행해서는 안됩니다.
콜 아웃 중재자로 전환하는 것은 이 아닙니다 이에 대한 이상적인 솔루션입니다. 프록시 구성에 문제가 있어야합니다.
여기 프록시 구성을 게시 할 수있는 경우,이를 해결하는 데 도움이 될 수 있습니다.