我正在构建基于Mule ESB的中间件,实现Asyncronous Web Services。 我有一个客户端通过SoapUI向使用启用了WS-Addressing功能的CXF Jax-ws服务实现的ESB端点发送Soap请求。我发送响应字符串" Hello"并开始处理输入参数,以便对具有callBack Web服务端点的客户端进行异步回复。
请求具有正确的Soap Header,标签为ReplyTo,其中包含客户端中callBack端点的地址。
这是我的服务器jax-ws网络服务代码:
@WebService(serviceName = "OrderReceive")
@Addressing
public class OrderReceive {
public String perform(String id, long creditCardNumber, List<Product> products) {
//Save values to process the async reply
setSessionVariable(id,creditCardNumber,products);
return "Hello, i will send the response soon";
}
}
问题是我的网络服务是自动编码到ReplyTo地址,我无法控制响应。
是否有可能拦截该响应,并设置正确的主体?
为什么我的网络服务会自动回复?
此致
答案 0 :(得分:2)
这就是我喜欢stackoverflow的原因。我从未听说过这个!!!
您的“自动回复”可能是由骡子中的行为引起的:
如果mule在消息中检测到 reply_to 属性,则启动对该端点的自动响应。这是jms中的请求 - 回复功能,但可能影响http连接器。
这个来源:
Automatic response when sending message
------------------- * ------------------------
在我研究之后,我发现ws-addressing的正确行为是:
client -- SOAP request ( on port A ) --> server
client <-- HTTP 202 ( "Hello, i will send the response soon" HTTP body ) --- server
client <-- SOAP response ("Response is ready!!" on port B ) --- server
来源:jax-ws 2.2.8 and ws-addressing
为了实现这一目标,我们需要:
1.-服务器端点: mule / cxf
2.-服务客户: soapui
3.-回调端点:接收异步响应(我认为这是骡子)
理解这一点,关于它的官方文件很难过:
MULE 3.7 Enabling WS-Addressing
我认为你需要CallBack Enpoint来创建和执行异步响应。我没有在骡子里找到任何东西:(。
这里有一些java实现的链接,没有mule:
Asynchronous web services with WS-Addressing
Invoke a single port async service using JAX-WS and WS-Addressing
------------------- * ------------------------
另一种解决方案可能是:
1.- mule / cxf中的Web服务没有寻址。
2.-内部操作方法:
public Response operation ( Request requestPayload ) {
MuleClient client = new MuleClient(muleContext);
client.dispatch("jms://my.queue", requestPayload , null);// this is async
return new Response("Hello, i will send the response soon.");
}
3.-创建一个jms入站端点监听:jms://my.queue
<flow>
<jms:inbound-endpoint queue="my.queue" >
<do something>
<launch a response to client>
</flow>
这可能是:
a.-通过电子邮件发送给客户
b.-使用客户发布的服务
c.-短信通知
d.-无论
这种方法可以更灵活,并支持未来的疯狂要求。
如果你需要一些关于mule cxf服务或jms的帮助,请告诉我们帮助你!!