2011-11-09 43 views
1

我有一個應用程序,它使用CXF的Servlet傳輸和Jetty 6.1提供服務。此應用程序還需要使用外部服務。所有的服務都支持WS-Addressing規範(WS-RM在上面)。爲了使用外部服務,我從應用程序運行生成的服務客戶端。CXF:通過現有的Servlet傳輸提供解耦端點

問題是,當我爲客戶端提供解耦的端點(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)。

回答

2

好吧,我自己找到了解決方案。您需要爲解耦的端點指定相對路徑並手動更改消息的尋址屬性(在MAPAggregator攔截器之後,因爲它設置瞭解耦目標),因此服務器可以將回復發送到您的地址。

所以,我們有:

    使用相對路徑
  1. 脫鉤目的地:/dec_endpoints/SomeDestination
  2. <ReplyTo>頭絕對路徑:http://addr.com:port/servlet_path/dec_endpoints/SomeDestination

下面是一個例子路徑如何可以改變的:

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"); 
    } 
} 
相關問題