ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server JAX-WS Webサービスの高度な機能のプログラミング
11g リリース1 (10.3.6)
B61633-05
  目次へ移動
目次

前
 
次
 

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

この章では、Oracleデータベースと対話する、Java API for XML Web Services (JAX-WS)を使用したWebLogic Webサービスの開発方法について説明します。

この章の内容は以下のとおりです。

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

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

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

JAX-WS Webサービスでのステートフル・サポートは、クライアント側、サーバー側ともに最小限のコーディングで有効にできます。

サーバーでHTTPセッションにアクセスする

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

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

  1. Webサービスの冒頭に(Common Annotations for the Java Platform、JSR 250で定義されている)@Resourceを追加します。

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

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

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

次のスニペットは、その使い方を示します:

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

@WebService
public class ShoppingCart {
   @Resource    // Step 1
   private WebServiceContext wsContext;    // Step 2
   public int addToCart(Item item) {
      // Find the HttpSession
      MessageContext mc = wsContext.getMessageContext();    // Step 3
      HttpSession session = ((javax.servlet.http.HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST)).getSession();
      if (session == null)
         throw new WebServiceException("No HTTP Session found");
      // Get the cart object from the HttpSession (or create a new one)
      List<Item> cart = (List<Item>)session.getAttribute("myCart");  // Step 4
      if (cart == null)
         cart = new ArrayList<Item>();
      // Add the item to the cart (note that Item is a class defined 
      // in the WSDL)
      cart.add(item);
      // Save the updated cart in the HTTPSession (since we use the same 
      // "myCart" name, the old cart object will be replaced)
      session.setAttribute("myCart", cart);
      // return the number of items in the stateful cart
      return cart.size();
   }
}

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

クライアント側コードはとても簡単です。必要なのは、リクエスト・コンテキストにSESSION_MAINTAIN_PROPERTYを設定することのみです。これにより、Webサービスから受信したHTTP Cookieを戻すようクライアントに指示します。Cookieには、サーバーがWebサービス呼出しを正しいHttpSessionと対応させるためのセッションIDが含まれており、これによって任意の保存済ステートフル・オブジェクトへのアクセスが可能になります。

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

ShoppingCart proxy = new CartService().getCartPort();
((BindingProvider)proxy).getRequestContext().put(BindingProvider.SESSION_MAINTAIN_PROPERTY, true);
// Create a new Item object with a part number of '123456' and an item 
// count of 4.
Item item = new Item('123456', 4);
// After first call, we'll print '1' (the return value is the number of objects 
// in the Cart object)
System.out.println(proxy.addToCart(item));
// After the second call, we'll print '2', since we've added another 
// Item to the stateful, saved Cart object.
System.out.println(proxy.addToCart(item));

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

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

セッション状態レプリケーションを使用してクラスタ化された環境を設定するには、様々な技術要件および構成要件(サポートされているサーバーやロード・バランサなど)があります。JAX-WSプログラミングの観点から、唯一の新しい考慮事項は、(例21-1に示されているように)HttpSession.setAttributeメソッドを使用してHttpSessionに格納するオブジェクトは、シリアライズ可能であることが必要な点です。シリアライズ可能であると、クラスタ内のレプリケートされたすべてのWebインスタンス上のWebサービスに対してそれらのステートフル・オブジェクトが使用可能になり、JAX-WSステートフルWebサービスでロード・バランシングとフェイルオーバーの両方の機能を使用できるようになります。

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

JAX-WS 2.1 Reference Implementation (RI)には、@Statefulアノテーションを使用してステートフルJAX-WS Webサービスの異なるモデルをサポートするベンダー拡張があります。その実装は、状態を特定のインスタンスに固定するもので、スケーラビリティやフォルト・トレランスを目的としていません。WebLogic Server JAX-WS Webサービスでは、この機能はサポートされません。