Mule ESB中的Ws-Addressing功能

时间:2015-11-12 22:21:22

标签: java mule cxf jax-ws ws-addressing

我正在构建基于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地址,我无法控制响应。

是否有可能拦截该响应,并设置正确的主体?

为什么我的网络服务会自动回复?

此致

1 个答案:

答案 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.");
}

参考:Using the Mule Client

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的帮助,请告诉我们帮助你!!

http://jrichardsz.github.io/