0

私は一般的な Jax-WS 仕様と、Glassfish 3.1.2 でのその実装を研究しています。wsimport によって生成されたアーティファクトを使用して、jax-ws SOAP ベースの Web サービスが JSP ページから呼び出される単純な標準的な例を作成しました (Web サービスと JSP ページは両方とも、同じ EAR 内の Glassfish にデプロイされますが、2 つの異なる war 内にあります)。 .

すべてが期待どおりに機能しますが、質問があります。アプリケーション ログを見ると、Glassfish は呼び出されるたびに Web サービスの新しいインスタンスを作成しているようです。WebコンテナがWebサービスインスタンスを管理する方法をJavaが公式に定義している場所と、開発者がこの動作をカスタマイズできるかどうかを知りたいです。

ここでjax-ws 2.1仕様を読みました

http://download.oracle.com/otndocs/jcp/jaxws-2.1-mrel2-eval-oth-JSpec/

しかし、Endpoint クラスを手動で使用して Web サービスを公開する方法について話しているときに、手がかりしか見つかりませんでした (セクション 5.2.2「公開」、69 ページ):

「エンドポイントは、Web サービスの実装 (ここではインプリメンターと呼ばれます) として機能するオブジェクトと、いくつかの構成情報で構成されています...

エンドポイントは通常、同時リクエストを処理するために呼び出されるため、その実装者は複数のスレッドをサポートするように作成する必要があります。synchronized キーワードは、コードのクリティカル セクションへのアクセスを制御するために通常どおり使用できます。着信リクエストのディスパッチに使用されるスレッドをより細かく制御するために、アプリケーションは使用するエグゼキュータを直接設定できます..."

この注記は、Jax-WS 2.2 仕様 (Glassfish 3 で使用) にも存在します。

実際、JavaSE 7 (Jax-WS 2.2 を含む) のみを使用して Web サービスを構築した場合、Web サービスのインスタンスは 1 つしかないため、この説明は当てはまります。JavaEE がこのポリシーに従わない理由はありますか?

ご協力ありがとうございました。

ニコ

4

1 に答える 1

1

この仕様(JSR-109)で答えを見つけました:

http://jcp.org/aboutJava/communityprocess/mrel/jsr109/index3.html

Jax-WS が JavaEE でどのように動作するかを説明します。

" 4.1 クライアント プログラミング モデル (18 ページ)

クライアントは、Web サービスのメソッドには、複数の Web サービス メソッドの呼び出しにわたって永続的な状態がないと想定する必要があります。クライアントは、Web サービスの実装をステートレスとして扱うことができます。

クライアントは、サーバー上の Web サービス実装のライフ サイクルを制御できません。クライアントは、ポートと呼ばれる Web サービスのインスタンスを作成または破棄しません。クライアントはポートにのみアクセスします。ポートのライフ サイクル、または Web サービス実装のインスタンスは、Web サービスをホストするランタイムによって管理されます。ポートには ID がありません。これは、クライアントがポートを他のポートと比較して、それらが同じか同一であるかを確認することも、クライアントが特定のポート インスタンスにアクセスすることもできないことを意味します。

5.3.2.4.2 JAX-WS の Web コンテナ プログラミング モデル (42 ページ)

サービス実装は、ステートレス オブジェクトである必要があります。サービス実装 Bean は、Bean インスタンスのデータ メンバー内またはインスタンスの外部のいずれかで、複数のメソッド呼び出しにわたってクライアント固有の状態を保存してはなりません。コンテナは、任意の Bean インスタンスを使用してリクエストを処理できます。

5.3.4 サービス実装 Bean のライフサイクル (43 ページ)

リクエストを処理する前に、コンテナはサービス実装 Bean をインスタンス化し、メソッド リクエストに対して準備する必要があります。コンテナーは、サービス実装 Bean のメソッド準備完了インスタンスをプールし、メソッド準備完了状態の任意のインスタンスにメソッド要求をディスパッチできます。"

さらに、仕様では、JavaEE が Endpoint クラスを使用して Web サービスを公開してはならないと述べています。

" 5.3.3 エンドポイントの公開 – javax.xml.ws.Endpoint (43 ページ)

JAX-WS は、javax.xml.ws.Endpoint API を使用して Web サービス エンドポイントを動的に作成および公開する機能を提供します。この機能の使用は、管理された環境では移植性がないと見なされます。Servlet と EJB コンテナーの両方が、エンドポイントの公開を動的に許可しないようにする必要があります。"

于 2013-10-20T10:41:53.633 に答える