1

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

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

有没有办法可以使用现有的 Jetty 服务器和 Servlet 传输来提供解耦端点?

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

Client client = ClientProxy.getClient(port);
HTTPConduit httpConduit = (HTTPConduit) client.getConduit();
httpConduit.getClient().setDecoupledEndpoint(
     "http://domain.com:port/services/dec_endpoints/TestDecEndpoint");

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

4

1 回答 1

2

Ok, I have found a solution myself. You need to specify a relative path for decoupled endpoint and change message's addressing properties manually (after MAPAggregator interceptor, 'cause it sets up the decoupled destination) so the server can send replies to your address.

So what we have:

  1. decoupled destination using a relative path: /dec_endpoints/SomeDestination
  2. <ReplyTo> header with an absolute path: http://addr.com:port/servlet_path/dec_endpoints/SomeDestination

Here's an example how the path can be changed:

public class ReplyToInterceptor extends AbstractPhaseInterceptor<Message>
{
    public ReplyToInterceptor() {
        super(Phase.PRE_LOGICAL);
        addAfter(MAPAggregator.class.getName());
    }

    public void handleMessage(Message message) {
        AddressingProperties maps = ContextUtils.retrieveMAPs(message, false, 
           true);
        EndpointReferenceType replyTo = maps.getReplyTo();
        replyTo.getAddress().setValue(
           "http://address.com:port/servlet_path/dec_endpoints/SomeDestination");
    }
}
于 2011-11-10T09:30:13.220 回答