ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server JAX-WS を使用した Web サービスの高度な機能のプログラミング
11g リリース 1 (10.3.1)
B55543-01
  目次
目次

戻る
戻る
 
次へ
次へ
 

10 HTTP セッションを使用したステートフル JAX-WS Web サービスのプログラミング

この章では、Oracle データベースと対話する JAX-WS Web サービスの開発方法について説明します。

ステートフル Web サービスの概要

通常、JAX-WS Web サービスはステートレスです。つまり、Web サービス オブジェクトに設定したどのローカル変数とオブジェクト値も、1 つの呼び出しから次の呼び出しまで保存されません。1 つのクライアントからの順次的な各リクエストも独立、ステートレス メソッド呼び出しとして扱われます。

クライアントが呼び出しの途中でサービスにデータを保存して、その後の呼び出しにそのデータを使用する Web サービスの使用例もあります。たとえば、addToCart Web メソッドを繰り返して呼び出すことでショッピング カート オブジェクトを追加でき、getCart web メソッドで取得できます。ステートレス Web サービスで、addToCart メソッド呼び出しの数に関係なく、ショッピング カート オブジェクトは常に空となります。しかし、Web サービスの呼び出しにステートの保持のために HTTP セッションを使用することで、カートが増分的に構築されて、クライアントに返されます。

JAX-WS Web サービスで、ステートフル サポートを有効するには、クライアントおよびサーバに最小限のコードが必要です。

サーバに HTTP セッションへのアクセス

サーバで、すべての Web サービスの呼び出しが HttpSession オブジェクトに関連付けられています。このオブジェクトは、リソース インジェクションを使用して Web サービス オブジェクトにバインドされている Web サービス コンテキストからアクセス可能です。HttpSession オブジェクトにアクセスできる場合は、それに任意のステートフル オブジェクトを「ハング」オフできます。クライアントが次に Web サービスを呼び出すときには、同じ HttpSession オブジェクトを探すことができ、以前に格納したオブジェクトも検索できます。Web サービスはステートフルです。

サーバでの必要な手順は以下のとおりです。

  1. Web サービスの上部に (Java プラットフォーム、JSR 250 で定義した共通のアノテーション) @Resource を追加します。

  2. コンテキストが注入されているWebServiceContext 型の変数を追加します。

  3. Web サービスを使用して HttpSession オブジェクトを取得します。

  4. setAttribute メソッドを使用して HttpSession にオブジェクトを保存し、getAttribute を使用して格納されたオブジェクトを取得します。オブジェクトが割り当てる文字列値によって識別されます。

以下の断片は、その使い方を示しています。

例 10-1 サーバに HTTP セッションへのアクセス

@WebService
public class ShoppingCart {
   @Resource    // 手順 1
   private WebServiceContext wsContext;    // 手順 2
   public int addToCart(Item item) {
      // HttpSession を検索する
      MessageContext mc = wsContext.getMessageContext();    // 手順 3
      HttpSession session = ((javax.servlet.http.HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST)).getSession();
      if (session == null)
         throw new WebServiceException("No HTTP Session found");
      // HttpSession からカート オブジェクトを取得する (または新しいオブジェクトを作成する)
      List<Item> cart = (List<Item>)session.getAttribute("myCart");  // 手順 4
      if (cart == null)
         cart = new ArrayList<Item>();
      // カートに項目を追加する (項目は 
      // WSDL で定義したクラスです)
      cart.add(item);
      // 更新したカートをHTTPSession に保存する (同じ「myCart」名を使用しているので、
      // 古いカート オブジェクトが置き換えられます)
      session.setAttribute("myCart", cart);
      // ステートフル カート内の項目数を返す
      return cart.size();
   }
}

クライアントでの HTTP セッションの有効化

クライアントサイド コードはとても簡単です。必要なのは、要求コンテキストに SESSION_MAINTAIN_PROPERTY を設定することです。これは、Web サービスから受信した HTTP クッキーを返すように、クライアントに指示します。クッキーには、Web サービスの呼び出しを任意のステートフル オブジェクトにアクセスを提供する正しい HttpSession と一致することを可能にするセッション IDがあります。

例 10-2 クライアントの HTTP セッションの有効化

ShoppingCart proxy = new CartService().getCartPort();
((BindingProvider)proxy).getRequestContext().put(BindingProvider.SESSION_MAINTAIN_PROPERTY, true);
// 部分番号 123456 を持つ新しい項目オブジェクトおよび
// カウント値は 4の項目を作成する。
Item item = new Item('123456', 4);
// 最初の呼び出しの後、「1」を印刷する (戻り値はカート オブジェクトの
// オブジェクトの数です)
System.out.println(proxy.addToCart(item));
// ステートフル、保存したカート オブジェクトに別の項目を追加したので、
// 2 回目の呼び出しの後、「2」を印刷する。
System.out.println(proxy.addToCart(item));

セッション ステート レプリケーションを使用してクラスタ内のステートフル サービスの開発

高可用性環境で、JAX-WS Web サービスは、クラスタ内の複数のサーバ インスタンスにレプリケートされる場合があります。ステートフル JAX-WS Web サービスは、WebLogic Server HTTP セッション ステートのレプリケーション機能の使用を介して、この環境でサポートされます。詳細については、『Oracle Fusion Middleware Oracle WebLogic Server クラスタの使い方』の「HTTP セッション ステートのレプリケーション」を参照してください。

ステート レプリケーションを使用してクラスタ環境を設定するには、さまざまな技術およびコンフィグレーション要件があります。(たとえば、サポート対象のサーバおよびロード バランシングなど)。JAX-WS プログラミングでは、唯一の新しい考慮事項は HttpSession.setAttribute メソッドを使用して HttpSession に格納するオブジェクトはシリアライズ可能でなければならないことです。(例10-1 のとおり)。シリアライズ可能な場合は、JAX-WS ステートフル Web サービスのロード バランシングおよびフェイルオーバ機能の両方を提供する、クラスタ内のすべてのレプリケート Web サービス インスタンスでの Web サービスに使用できるようになります。

JAX-WS RI @ステートフル拡張に関する注意

JAX-WS 2.1 参照実装 (RI) には、@Stateful アノテーションを使用して、ステートフル JAX-WS Web サービスのさまざまなモデルにサポートしているベンダ拡張があります。その実装が状態を特定のインスタンスに「固定」して、スケーラブルまたはフォールトトレランスでないように設計されています。WebLogic Server JAX-WS Web サービスで、この機能はサポートされません。