我正在尝试基于某些专有的二进制协议为WSO2 ESB实现我的特定传输。从协议规范我需要确认我收到的每个数据包只有在我100%确定它将来会被处理的时候。出于这些原因,必须使用一些持久存储。
我希望通过WSO2 ESB序列实现协议逻辑,该序列获取协议数据包/消息并将它们存储到临时messageStore
中,该临时messageStore
用作生产者/消费者模式中的队列(其中生产者是传输本身,而消费者是我的包处理器)。
在向客户端发送确认之前,我必须确保我的数据包到达AxisEngine.receive()
。但是,即使消息存储不可用,<proxy name="MyProxyService">
<target>
<inSequence>
<store messageStore="MyStore" sequence="onStoreSequence"/>
</inSequence>
<outSequence>
<send/>
</outSequence>
<faultSequence>
<makefault version="soap11" response="true">
<code xmlns:tns="http://www.w3.org/2003/05/soap-envelope" value="tns:Receiver"/>
<reason expression="get-property('ERROR_MESSAGE')"/>
</makefault>
<send/>
</faultSequence>
</target>
</proxy>
也总会返回CONTINUE。
代理的配置是:
MessageContext msgContext = confContext.createMessageContext();
AxisConfiguration axisConf = confContext.getAxisConfiguration();
try {
msgContext.setTransportIn(axisConf.getTransportIn(transportName));
msgContext.setTransportOut(axisConf.getTransportOut(transportName));
msgContext.setIncomingTransportName(Constants.TRANSPORT_LOCAL);
msgContext.setAxisService(axisConf.getService("MyProxyService"));
msgContext.setEnvelope(TransportUtils.createSOAPMessage(msgContext));
msgContext.setServerSide(true);
Handler.InvocationResponse response = AxisEngine.receive(msgContext);
log.error(String.valueOf(response));
} catch (Exception e) {
log.error("ERROR", e);
}
我在传输中使用的代码是:
{{1}}
我想要的行为是我在HTTP传输中看到的:来自客户端的HTTP请求(SOAP UI)被转换为Axis2 MessageContext并传递给MyProxyService。如果一切正常 - 我得到积极的回应,否则 - 错误代码和SOAP错误。
答案 0 :(得分:0)
经过进一步调查后,我可以说HTTP传输请求/响应背后的想法是,为了发送响应,使用了HttpSender
而不是HttpReceiver
。 HttpReceiver
从HTTP连接获取请求,设置到消息上下文的HTTP连接的链接,使用AxisEngine.receive()
将消息传递给ESB并返回。
HTTP响应本身通过HttpSender
接收,标识为对先前请求的响应(通过空 To 标头)并发送到从消息上下文引用的连接。