0

私は SoapHandler の実装に取り​​組んでいます。基本的に私の目的は、リクエストとレスポンスの両方のペイロードを取得してデータベースに挿入することです。

リクエストとレスポンスのペイロードは取得できましたが、コードがスレッドセーフに機能しているかどうかは確認できませんでした。つまり、応答が適切な要求と一致するかどうかはわかりません。

public boolean handleMessage(SOAPMessageContext mContext) {

    boolean isResponse = (Boolean) mContext
            .get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);

    if (!isResponse) {
        try {
            mContext.put("currentStream", new ByteArrayOutputStream());
            mContext.getMessage().writeTo((OutputStream) mContext.get("currentStream"));

        } catch (SOAPException | IOException e) {
            e.printStackTrace();
        }
    } else {
        try {
            mContext.getMessage().writeTo(
                    (OutputStream) mContext.get("currentStream"));
            System.out.println(((OutputStream) mContext.get("currentStream"))
                    .toString());
            ((OutputStream) mContext.get("currentStream")).flush();
        } catch (SOAPException | IOException e) {
            e.printStackTrace();
        }
    }

    return true;
}

JCP仕様でこれを見つけました:

9.3.3 ハンドラの実装に関する考慮事項

ハンドラ インスタンスは、JAX-RPC ランタイム システムによってプールされる場合があります。特定のハンドラーのすべてのインスタンスは、JAX-RPC ランタイム システムによって同等と見なされ、特定のメッセージを処理するために任意のインスタンスを選択できます。MEP の各メッセージを処理するために、異なるハンドラ インスタンスを使用できます。ハンドラー チェーン内の各ハンドラー、MEP 内の各メッセージ、またはこの 2 つの任意の組み合わせに対して、異なるスレッドを使用できます。ハンドラーは、スレッド ローカルの状態に依存して情報を共有するべきではありません。ハンドラーは代わりにメッセージ コンテキストを使用する必要があります。セクション 9.4 を参照してください。

9.4 メッセージコンテキスト

ハンドラーは、受信メッセージと送信メッセージにアクセスして変更し、一連のプロパティを管理するためのメソッドを提供するメッセージ コンテキストで呼び出されます。さまざまなタイプのハンドラーが、さまざまなタイプのメッセージ コンテキストで呼び出されます。セクション 9.4.1 と 9.4.2 では、MessageContext と LogicalMessageContext についてそれぞれ説明しています。さらに、JAX-RPCバインディング12は、プロトコル固有の機能へのアクセスを提供する特定のプロトコル・バインディングのためのメッセージ・コンテキスト・サブタイプを定義することができる。セクション10.3では、JAX-RPC SOAPバインディングのメッセージ・コンテキスト・サブタイプについて説明しています。

http://download.oracle.com/otn-pub/jcp/jaxrpc-2.0-edr2-spec-oth-JSpec/jaxrpc-2_0-edr2-spec.pdf?AuthParam=1431341511_1ac4403a34d7db108bce79eda126df49

これは、リクエストごとに新しい MessageContext オブジェクトが作成されることを意味しますか (この場合、コードはスレッドセーフになると思います)、または同じ MessageContext オブジェクトを複数のリクエストに使用できます (私のコードはスレッドセーフではありません)。

ヘルプ/代替ソリューションをいただければ幸いです。

4

1 に答える 1