1

CXFのサーブレットトランスポートとJetty6.1を使用してサービスを提供するアプリケーションがあります。このアプリケーションは、外部サービスも利用する必要があります。すべてのサービスは、WS-Addressing仕様(および最上位のWS-RM)をサポートしています。外部サービスを利用するために、アプリケーションから生成されたサービスクライアントを実行します。

問題は、クライアントに分離されたエンドポイントを提供すると(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にメッセージを送信できません)。

4

1 に答える 1

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");
    }
}
于 2011-11-10T09:30:13.220 に答える