私は 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バインディングのメッセージ・コンテキスト・サブタイプについて説明しています。
これは、リクエストごとに新しい MessageContext オブジェクトが作成されることを意味しますか (この場合、コードはスレッドセーフになると思います)、または同じ MessageContext オブジェクトを複数のリクエストに使用できます (私のコードはスレッドセーフではありません)。
ヘルプ/代替ソリューションをいただければ幸いです。