2011-11-09 7 views
1

CXFのServletトランスポートとJetty 6.1を使用してサービスを提供するアプリケーションがあります。このアプリケーションは、外部サービスも消費する必要があります。すべてのサービスは、WS-Addressing仕様(およびWS-RMを一番上に)をサポートしています。外部サービスを使用するには、アプリケーションから生成されたサービスクライアントを実行します。CXF:既存のServletトランスポート経由でデカップリングされたエンドポイントを提供する

問題は、クライアントのデカップリングされたエンドポイントを提供するとき(WS-RMがこのエンドポイントで別々のHTTP接続を介して受信メッセージを受信する必要がある)、CXFがJettyサーバーの別のインスタンスを実行することです。 (サービスを提供する)トランスポートと(何らかの外部サービスを消費する)クライアントが同じバスを共有する)。私はJettyの2つのインスタンスを必要としません(同じHTTPポート上で実行することはできません)。

既存のJettyサーバーとサーブレットトランスポートを使用してデカップリングされたエンドポイントを提供する方法はありますか?

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

私は相対パスを提供する場合(「/ dec_endpoints/TestDecEndpoint」、相対パスは、サーブレット・トランスポートを経由してサービスの提供に使用されているだけのように):

はこれまでのところ、私はこのような切り離されたエンドポイントを有効にします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"); 
    } 
} 
関連する問題