1

私は SAP NetWeaver 7.3 EHP 1 (JEE5 認定済み) を使用しており、既存の WSDL の Web サービス スケルトンを生成しました。この Web サービスのすべてのメソッドは非ブロッキングであるため、 の注釈が付けられ@Onewayます。サービス自体は問題なく動作します。

注入されたものにもアクセスする必要がありますWebServiceContextが、ここから問題が始まります。コンテキストを問題なく挿入できますが、それに対するすべての呼び出しは、サーバー固有の NPE または ISE で終了します。非ブロッキング呼び出しは SAP の JAX-WS 実装によって非同期に実行されるため、そのことはある程度理解できます。ただし、JAX-WS 仕様を調べて、この動作を検証しようとしました。今、私は目が見えないかWebServiceContext、非ブロッキング Web メソッドで a を使用してはならないことを仕様が具体的に述べていないかのどちらかです。実際、仕様の最新バージョンの 5.3 章全体で、@Oneway一度も言及されていません。主な説明は

javax.xml.ws.WebServiceContext インターフェースにより、エンドポイント実装オブジェクト、および場合によってはその実行コンテキストを共有する他のすべてのオブジェクトが、処理されている要求に関する情報にアクセスできるようになります。コンポーネントの WebServiceContext で、その Web サービス メソッドのいずれかの呼び出しの外部でメソッドを呼び出した結果は未定義です。そのような使用法を検出した場合、実装は java.lang-.IllegalStateException をスローする必要があります。

ポイントは「リクエストが処理される」の定義だと思います。SOAP操作の非同期処理時には、HTTPリクエストはすでに終了しています。しかし、繰り返しになりますが、「Webサービスメソッドの呼び出しの外部」でコンテキストにアクセスしていません。よくわかりません...

WebServiceContext非ブロッキング Web メソッドでのアクセスを許可する必要があるかどうかを知っている人はいますか? ありがとう!

4

1 に答える 1

2

おっしゃる通りです。仕様はこの制限について何も述べていません。漠然と暗示されているだけです。

JAX-WS 仕様 (2.2 Rev A) から:

WebServiceContext は、エンドポイントの初期化時に設定できる注入可能なリソースとして扱われます。WebServiceContext オブジェクトは、同じエンドポイント オブジェクトにアドレス指定された要求を処理するために同時に使用されているスレッドの数に関係なく、スレッド ローカル情報を使用して正しい情報を返します。

エンドポイントが存在する間は操作可能である必要がありますが、リクエストのコンテキスト情報をセットアップしてスレッド ローカル メモリ ストレージに格納した同じスレッドで使用された場合に限ります。WebServiceContext が主に MessageContext 情報であり、HTTP リクエスト / サーブレット リクエスト / WSDL 操作の設定であることを考えると、スレッド ローカルのコンテキスト情報は、SOAP/HTTP リクエストを最初にマーシャリングするスレッドによって入力される必要がある可能性があります。スレッドにはこの情報がありません。読んだだけに基づいています-この組み合わせはテストしていません。

于 2013-03-18T05:46:48.507 に答える