Я пытаюсь реализовать регулирование нагрузки 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 без кода? Если да, то что я делаю не так? Заранее спасибо.