Недействительный адрес EPR — процессор сообщений WSO2 для гарантированной двусторонней доставки

Я пытаюсь реализовать регулирование нагрузки WS (дросселирование) с помощью функции обработчика сообщений WSO2, основная идея заключается в том, что запросы от клиента и ответы от серверной части ставятся в очередь в двух разных хранилищах сообщений в WSO2. Два процессора сообщений берут сообщение в секунду из очереди и отправляют его своим получателям. В то же время клиент ожидает блокировки, так как это двусторонняя связь.

Схема посредничества такова:

STEP 1: Client -> Proxy (Stores client request message in requests queue)
STEP 2: Message Processor "Requests" reads message from requests queue -> Sends to "echo" Enpoint -> Sends to "store" Sequence (stores echo response request message in responses queue)
STEP 3: Message Processor "Responses" reads message from response queue -> Sends to Reply sequence
STEP 4: Reply Sequence -> Client

Мой основной прокси-сервер называется Queue, и я запускаю тест с эхо-прокси в качестве конечной точки бэкэнда. Это вывод журнала четырех шагов потока


Сначала получите запрос и сохраните его в хранилище сообщений запросов.

2014-05-27 20:32:50,789]  INFO - LogMediator STEP = 1 Store Request
2014-05-27 20:32:50,793]  INFO - LogMediator To: 
/services/Queue.QueueHttpSoap12Endpoint, WSAction: urn:mediate, SOAPAction: urn:mediate, MessageID: urn:uuid:ff2f0caa-cab9-4ece-8bb1-223a7ba97bf2, Direction: request, Envelope: 
<?xml version="1.0" encoding="utf-8"?><soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope" 
xmlns:echo="http://echo.services.core.carbon.wso2.org"><soap:Body>
  <echo:echoString>
  <in>test</in>
  </echo:echoString>
</soap:Body></soap:Envelope>

Через 1 секунду процессор сообщений запроса читает из хранилища сообщений запросов и отправляет его в конечную точку эха.

2014-05-27 20:32:50,813]  INFO - LogMediator WHEN = 2 Send Request to Backend
2014-05-27 20:32:50,814]  INFO - LogMediator To: 
/services/testt.testtHttpSoap12Endpoint, WSAction: urn:mediate, SOAPAction: urn:mediate, 
MessageID: urn:uuid:86b9f0d0-b970-4933-9be5-674799c9df4d, Direction: request, Envelope: 
<?xml version="1.0" encoding="utf-8"?><soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope" 
xmlns:echo="http://echo.services.core.carbon.wso2.org"><soap:Body>
  <echo:echoString>
  <in>test</in>
  </echo:echoString>
</soap:Body></soap:Envelope>

Ответ от эха получен и сохранен в очереди сообщений ответов

2014-05-27 20:32:50,843]  INFO - LogMediator Step = 3 Receive Response from Backend and Store
2014-05-27 20:34:13,914]  INFO - LogMediator To: 
http://www.w3.org/2005/08/addressing/anonymous, WSAction: , SOAPAction: , MessageID: 
urn:uid:151B5E166555B48DAF818687464483291310017303, Direction: response, Envelope: <?
xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns
soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Body><ns:echoStringResponse 
xmlns:ns="http://echo.services.core.carbon.wso2.org"
<return>test</return></ns:echoStringResponse></soapenv:Body></soapenv:Envelope>

Пока все хорошо, но на последнем этапе обработчик сообщений читает очередь ответов и пытается отправить сообщение клиенту, но терпит неудачу.

2014-05-27 20:34:13,913]  INFO - LogMediator WHEN = 4 Send Response Message to client 
2014-05-27 20:34:13,914]  INFO - LogMediator To: 
http://www.w3.org/2005/08/addressing/anonymous, WSAction: , SOAPAction: , MessageID: 
urn:uuid:151B5E166555B48DAF818687464483291310017303, Direction: response, Envelope: <?xml 
version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns
soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Body><ns:echoStringResponse 
xmlns:ns="http://echo.services.core.carbon.wso2.org"
<return>test</return></ns:echoStringResponse></soapenv:Body></soapenv:Envelope>

2014-05-27 20:34:13,915] ERROR - PassThroughHttpSender No valid destination EPR to send message
2014-05-27 20:34:13,915] ERROR - Axis2Sender Content-Type:application/soap+xml; 
charset=UTF-8; action="urn:echoStringResponse",<?xml versio
="1.0" encoding="utf-8"?><soapenv:Envelope 
xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Body>
<ns:echoStringResponse xmls:ns="http://echo.services.core.carbon.wso2.org"><return>test</return>
</ns:echoStringResponse></soapenv:Body></soapenv:Envelope> Unexpected
error sending message back org.apache.axis2.AxisFault: No valid destination EPR to send message

Похоже, что "Кому: http://www.w3.org/2005/08/addressing/anonymous" не выглядит как действительный EPR.

Вопрос: Можно ли добиться такой буферизации запросов через WSO2 без кода? Если да, то что я делаю не так? Заранее спасибо.


person user3678878    schedule 28.05.2014    source источник


Ответы (1)


Кажется, что это проблема корреляции между вашим первоначальным запросом и ответом на стороне клиента/прокси.

Вы можете сопоставить выходное сообщение об отсутствии очереди со следующим действием в очереди. Посмотрите эту статью с похожим сценарием " Синхронные вызовы JMS: двухканальный HTTP-to-JMS".

С уважением.

person Chilcano    schedule 29.05.2014