Jetty CXF:通过现有Servlet传输提供解耦的端点

Jetty CXF:通过现有Servlet传输提供解耦的端点,jetty,cxf,endpoint,ws-addressing,ws-reliablemessaging,Jetty,Cxf,Endpoint,Ws Addressing,Ws Reliablemessaging,我有一个应用程序,它使用CXF的Servlet传输和Jetty 6.1提供服务。此应用程序还需要使用外部服务。所有服务都支持WS-Addressing规范(顶部支持WS-RM)。为了使用外部服务,我从应用程序运行生成的服务客户端 问题是,当我为客户机提供一个解耦的端点(WS-RM需要该端点通过单独的http连接接收传入消息)时,CXF运行Jetty server的另一个实例(尽管Servlet传输(提供服务)和客户机(使用一些外部服务)共享同一总线). 我不需要Jetty的两个实例(并不是说它们

我有一个应用程序,它使用CXF的Servlet传输和Jetty 6.1提供服务。此应用程序还需要使用外部服务。所有服务都支持WS-Addressing规范(顶部支持WS-RM)。为了使用外部服务,我从应用程序运行生成的服务客户端

问题是,当我为客户机提供一个解耦的端点(WS-RM需要该端点通过单独的http连接接收传入消息)时,CXF运行Jetty server的另一个实例(尽管Servlet传输(提供服务)和客户机(使用一些外部服务)共享同一总线). 我不需要Jetty的两个实例(并不是说它们不能在同一个HTTP端口上运行)

有没有一种方法可以使用现有的Jetty服务器和Servlet传输提供一个解耦的端点

到目前为止,我启用了这样一个解耦端点:

Client-Client=ClientProxy.getClient(端口);
httpconductor=(httpconductor)client.getconductor();
httpconductor.getClient().setDecoupledPoint(
"http://domain.com:port/services/dec_endpoints/TestDecEndpoint");

如果我提供一个相对路径(“/dec_endpoints/testdecedpoint”,就像通过Servlet传输提供服务时使用相对路径一样),HTTP管道不会在SOAP消息头中指定完整路径,因此这也不起作用(服务器无法向/dec_endpoints/testdecedpoint发送消息)。

Ok,我自己也找到了解决办法。您需要为解耦的端点指定相对路径,并手动更改消息的寻址属性(在MAPAggregator interceptor之后,因为它设置了解耦的目标),以便服务器可以向您的地址发送回复

因此,我们有:

  • 使用相对路径解耦的目标:
    /dec\u endpoints/SomeDestination
  • 带有绝对路径的标题:
    http://addr.com:port/servlet_path/dec_endpoints/SomeDestination
  • 以下是如何更改路径的示例:

    公共类ReplyToInterceptor扩展了AbstractPhaseInterceptor
    {
    公共ReplyToInterceptor(){
    超级(阶段前逻辑);
    addAfter(MAPAggregator.class.getName());
    }
    公共无效handleMessage(消息消息){
    AddressingProperties maps=ContextUtils.retrieveMAPs(消息,false,
    正确的);
    EndpointReferenceType replyTo=maps.getReplyTo();
    replyTo.getAddress().setValue(
    "http://address.com:port/servlet_path/dec_endpoints/SomeDestination");
    }
    }