我正在尝试通过 WSO2 消息处理器功能实现 WS 负载调节(节流),基本思想是来自客户端的请求和来自后端的响应在 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,我正在使用 echo 代理作为后端端点运行测试。这是流程的四个步骤的日志输出
首先接收请求并将其存储在请求消息存储中
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>
接收来自 echo 的响应并将其存储在响应消息队列中
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实现这种零代码的请求缓冲?如果是这样,我做错了什么?提前感谢。