IBM®
本文へジャンプ
    Japan [変更]    ご利用条件
 
 
検索範囲検索:    
    ホーム    製品    サービス & ソリューション    サポート & ダウンロード    マイアカウント    
skip to main content

developerWorks Japan  >  SOA and Web services | Grid computing  >

WebSphere Studio を使用したステートフルな Web サービスの実装とアクセス、パート2

WS-Resource のライフ・サイクル管理

developerWorks
ページオプション

JavaScript を要するドキュメントオプションは表示されません

サンプルコード

原文はこちら

原文はこちら


レベル: 上級

Hidayatullah Shaikh (hshaikh@us.ibm.com), Senior Software Engineer, IBM 

2005年 5月 04日

Web Services Resource Framework では、Web サービスを使用して状態にアクセスするモデルを提案します。 WS-Resource Lifetime 仕様には、WS-Resource を破棄するための「即時破棄」と「スケジュール破棄」という2 種類の方法が定義されています。 設計者は、これらのプロセスを使用することによって、不要になったリソースを自作のWeb サービス・アプリケーションを使用して柔軟にクリーンアップできます。この記事では、WebSphere Studio Application Developer Integration Edition5.0.1 を使用して、IBM® WebSphere® Application Server 環境内に2 種類の破棄メカニズムを実装する方法について説明します。

WS-Resource の存続期間とは、その生成から破棄までの期間を指します。 リソースのライフ・サイクルは、静的な場合と動的な場合があります。ライフ・サイクルが静的なリソースとは、システム上で作成されるかシステムに配備された後、永続的または半永続的に存続するリソースのことです。ライフ・サイクルが静的なリソースは、システム管理の主体が意図的にリソースを破棄するのとは別に、ハードウェアまたはソフトウェアの障害によって、意図とは無関係に破棄される可能性があります。これとは対照的に、ライフ・サイクルが動的なリソースは、頻繁に作成され破棄されます。

多くのシナリオでは、リソースのクライアントがそのリソースを明示的に破棄するのが適切です。そのようなケースでは、WS-Resource が、サービス・リクエスターがリソースの破棄を要求することを可能にするメッセージ交換パターンをサポートしている場合があります。これが、WS-Resource Lifetime 仕様で定義されている「即時破棄」のメカニズムです(『参考文献』 参照)。

ただし、分散コンピューティングの Web 環境では、ユーザーがサービス・プロバイダーのエンドポイントから切り離された状態になって、リソースを明示的に破棄できないことがあります。WS-Resource Lifetime 仕様では、動的なライフ・サイクルを有するリソースを破棄するための手段が標準化されています。この仕様では、リソース・インスタンスの任意のクライアントが、そのリソース・インスタンスへのインタレストを特定の期間に設定し、更新する手段が定義されています。その期間が経過した時点で、クライアントによる明示的な破棄要求なしに、そのリソース・インスタンスが自己消滅するように設定することができます。この WS-Resource の破棄の管理に使用される時間ベースのアプローチは、「スケジュール破棄」とも呼ばれます。

この記事では、シンプルな計算機サービスの例を使用して、IBM® WebSphere®Application Server 環境で WS-Resource の即時破棄とスケジュール破棄の両方を実装する方法について説明します。

対象読者

この記事は、J2EE テクノロジー、Web サービス、および WebSphere ApplicationServer V5 Enterprise Edition に関する基本的な知識のある方を対象にしています。これらのテクノロジーに関する理解を深めたい場合は、この記事の『参考文献』セクションで入門用として優れた資料を紹介していますのでご利用ください。また、IBM developerWorks で入手できる資料を参照することをお勧めします。

さらに、このシリーズの最初の記事、「WebSphere Studio を使用したステートフルな Web サービスの実装とアクセス、パート1 : サービスを介したリソースへのアクセス」も併せて参照し、記事中で使用されている計算機の例に対する理解を深めておくことも必要です。




上に戻る


サンプル・コードの内容と要件

この記事内のサンプルの作成には、IBM® WebSphere® Studio ApplicationDeveloper Integration Edition, V5.0.1 を使用しました。 また、これらのサンプルは、WebSphereApplication Server Enterprise Edition V5.0.2 に組み込まれたテスト環境において単体でテスト済みです。

ファイル ws-statefulws2code.zip には、この記事に収録されたコード・サンプルが含まれています。このファイルは、この記事の最初または最後の部分にある「Code」アイコンをクリックしてダウンロードできます。 このファイルには、次のファイルが含まれています。

WASv5WSAExtensions.jarSOAP メッセージの WS-Addressing メッセージ情報ヘッダーの作成時やアクセス時に、WebSphereApplication Server によって必要とされるユーティリティー・クラスを含む JARファイル。 WS-Addressing のエンドポイント・リファレンスを操作するためのヘルパー・クラスも含まれています。これらのクラスは、WebSphere Studio アプリケーションでの使用に合わせて構成できます。
WASvsWSAExtensions-javadoc.zip ユーティリティー・クラス用の javadoc。
CalculatorService.ear ステートフルな計算機サービス (サンプル)。 計算機サービスを簡単に呼び出すためのWeb アプリケーションが提供されます。
WASv5WSRLExtensions.jar スケジュール破棄サポート用の WSRL ヘルパー・クラス。



上に戻る


計算機サンプル

ここでは、このシリーズのパート 1 に掲載した計算機サンプルを使用します。計算機リソースの状態は、CalculatorState Entity Bean に格納されています。また、計算機の状態の即時破棄をサポートするために計算機 Web サービス・インターフェースを拡張するとともに、計算機の状態のスケジュール破棄を実装する方法を説明するために実装の一部を変更します。この記事に記載する説明は、このシリーズのパート 1 で使用したサンプル・コードを変更する際の参考になります。これらの変更を完了すると、ws-statefulws2code.zipで示されたコードに似たコードが完成します。




上に戻る


即時破棄

即時破棄をサポートするためには、サービス・リクエスターがリソースの即時破棄を要求できるように、計算機WS-Resource で破棄メッセージ交換パターンをサポートする必要があります。そのために、計算機 Web サービスの WSDL に Destroy オペレーションを追加します。Destroy オペレーションのシグニチャーは、WS-Resource Lifetime 仕様で定められています。また、このオペレーションの要求および応答に対応するメッセージ定義も、この仕様で定められています。リスト 1 は、この WSDL の該当部分を示しています。 詳細については、CalculatorService.earに含まれている Calculator.wsdl ファイルを参照してください。


リスト 1. 計算機 WSDL に追加される Destroy オペレーション
                
<wsdl:definitions targetNamespace="http://calculator.samples.ibm.com"
   ...
  xmlns:wsrl="http://www.ibm.com/xmlns/stdwip/web-services/WS-ResourceLifetime" 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <wsdl:types>
 <xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" 
     targetNamespace="http://www.ibm.com/xmlns/stdwip/web-services/WS-    
         ResourceLifetime">
        <xsd:element name="Destroy">
                <xsd:complexType />
        </xsd:element>
        <xsd:element name="DestroyResponse">
                <xsd:complexType />
        </xsd:element>
 </xsd:schema>
...
</wsdl:types>
...
<wsdl:message name="DestroyRequest">
  <wsdl:part name="DestroyRequest" element="wsrl:Destroy" /> 
  </wsdl:message>


 <wsdl:message name="DestroyResponse">
  <wsdl:part name="DestroyResponse" element="wsrl:DestroyResponse" /> 
  </wsdl:message>
...
  <wsdl:portType name="CalculatorService">
      ...
      <wsdl:operation name="Destroy">
         <wsdl:input message="intf:DestroyRequest" name="DestroyRequest"/>
         <wsdl:output message="intf:DestroyResponse" name="DestroyResponse"/>
      </wsdl:operation>

   </wsdl:portType>
...


リスト 2 は、更新済みの WSDL を WSDL2Java ユーティリティーを通じて実行した後に得られるサービス・エンドポイント・インターフェースを示しています。


リスト 2. destroy() メソッドを含むサービス・エンドポイント・インターフェース
                
public interface CalculatorService extends java.rmi.Remote 
{

    public javax.xml.soap.SOAPElement getCalculator(java.lang.String accountName)
              throws java.rmi.RemoteException;
    public float add(float value) throws java.rmi.RemoteException;
    public float getTotal() throws java.rmi.RemoteException;
    public float sub(float value) throws java.rmi.RemoteException;
    public void destroy() throws java.rmi.RemoteException;

}

リスト 3 は、計算機 Web サービス内の destroy() メソッドの実装を示しています。 この例で、ターゲットとなる暗黙的リソースを識別するためにサービスが必要とする値は、WS-Addressingリファレンス・プロパティーの calcID に含まれています。 calcID は、最初にリファレンス・プロパティーから取得され、CalculatorStateEJB ホームの findByPrimaryKey メソッドを呼び出して、CalculatorState EntityEJB コンポーネントの正しいインスタンスを検索するのに使用されます。 その後、CalculatorStateBean 上で remove() メソッドを呼び出すことによって、WS-Resource を破棄します。


リスト 3. destroy() メソッドの実装
                
public void destroy(){
        System.out.println("Destroy called in Service");
        try {
                CalculatorStateLocalHome home = getCalculatorStateHome();
                if (home != null) {
                  String calcID = EPRHelper.getReferencePropertyFromContext(
                                      CALCULATOR_NS,
                                      CALCULATOR_LOCALNAME_CALCID);

                  CalculatorStateLocal calculatorState =
                                         home.findByPrimaryKey(calcID);

                  if (calculatorState != null)   calculatorState.remove();
                }
        } catch (FinderException e) {
                e.printStackTrace();
        } catch (EJBException e) {
                e.printStackTrace();
        } catch (RemoveException e) {
                e.printStackTrace();
        }
}

これで、リスト 4 に示すように、計算機 WS-Resource のクライアントが destroy() メソッドを呼び出してリソースを明示的に破棄することが可能になりました。詳細については、CalculatorService.ear に含まれている CalculatorTestExecute.jspファイルを参照してください。

Destroy 要求は、Implied Resource パターンに従います。 ターゲットとなる暗黙的リソースを識別するためにサービスが必要とする識別子の値は、WS-Addressingリファレンス・プロパティーに含まれています。また、それらの値は、Destroy要求メッセージの一部としてSOAP ヘッダーに含まれていなければなりません。リスト 5 および 6 は、Destroy メッセージ交換の SOAP エンコーディングを示しています。


リスト 5. Destroy 要求の SOAP メッセージ
                
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<soapenv:Header xmlns:wsa="http://schemas.xmlsoap.org/ws/2003/03/addressing">         
<wsa:To>http://localhost:9080/CalculatorServiceWeb/services/CalculatorService</wsa:To>
<calcID xmlns="http://calculator.samples.ibm.com">1079046560736</calcID>
<dummyProp xmlns="http://calculator.samples.ibm.com">EXAMPLE PROPERTY</dummyProp>
</soapenv:Header>

<soapenv:Body>
   <Destroy xmlns=
   "http://www.ibm.com/xmlns/stdwip/web-services/WS-ResourceLifetime"/>
</soapenv:Body>

</soapenv:Envelope>



リスト 6. DestroyResponse の SOAP メッセージ
                
<?xml version="1.0" encoding="UTF-8"?>
   <soapenv:Envelope 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <soapenv:Body>
         <DestroyResponse 
         xmlns="http://www.ibm.com/xmlns/stdwip/web-services/WS-ResourceLifetime"/>
      </soapenv:Body>
   </soapenv:Envelope>





上に戻る


スケジュール破棄

前のセクションでは、計算機 WS-Resource に即時破棄のサポートを追加する方法について検討しました。このセクションでは、時間ベースの破棄、つまりスケジュール破棄をサポートするために、計算機サンプルを拡張します。そのために、WebSphere Application Server V5 Enterprise Edition のスケジューラー・サービスを使用します。このスケジューラー・サービスにより、要求したタイミングでタスクを実行することが可能になります。次のタスクをスケジュールできます。

  • 任意の Session Bean メソッドの呼び出し
  • 任意の JMS メッセージの送信

スケジューラー・サービスの有効化と構成の詳細については、この記事の最後の部分にある『参考文献』セクションを参照してください。

計算機リソースを作成し、30 秒後に自己消滅するように拡張します。つまり、このリソースの存続期間は30 秒です。 これを実現するために、計算機リソースを作成し、次に計算機サービス実装を拡張します。その際、スケジューラーで 30 秒の起動時間を設定してライフ・サイクル・タスクをスケジュールします。スケジューラーがライフ・サイクル・タスクを起動すると、ライフ・サイクルBean の process() メソッドが呼び出されます。 process() メソッドの実装には、WS-Resourceのインスタンスを破棄するためのコードが含まれています。

ここで、ライフ・サイクル・タスク Bean の実装について見てみましょう。 以下の手順を実行することになります。

  1. ステートレス Session Bean である CalculatorResourceLifeCycleTask を作成します。
  2. その Bean のデプロイメント記述子内で、ホームとリモートのインターフェースを、それぞれcom.ibm.websphere.scheduler.TaskHandlerHomeおよび com.ibm.websphere.scheduler.TaskHandler に設定します。
  3. TaskHandlerリモート・インターフェース内に process() メソッドを実装します。process() メソッドは、タスク起動時に呼び出されます。 リスト 7 は、この例の process() メソッドを示しています。 計算機リソースの状態の主キーであるcalcID は、最初にタスク状況オブジェクトから取得され、CalculatorState EJBコンポーネント・ホームの findByPrimaryKey() メソッドを呼び出して、CalculatorStateEntity EJB コンポーネントの正しいインスタンスを検索するのに使用されます。その後、CalculatorState Bean インスタンス上で remove() メソッドを呼び出すことによって、WS-Resourceを破棄します。 詳細については、CalculatorService.ear に含まれている CalculatorResourceLifeCycleTaskBean.javaファイルを参照してください。

リスト 7. ライフ・サイクル・タスク Bean の process メソッドの実装
                
public void process(TaskStatus status)
{
        CalculatorStateLocal calculatorState = null;
        try {
                        String calcID = status.getName();
                InitialContext ic = new InitialContext();

                Object o = ic.lookup("java:comp/env/ejb/CalculatorState");

                CalculatorStateLocalHome home =
                        (CalculatorStateLocalHome) PortableRemoteObject.narrow(
                                        o,
                                        CalculatorStateLocalHome.class);

                calculatorState = home.findByPrimaryKey(calcID);

                calculatorState.remove();

                } catch (NamingException e) {
                        e.printStackTrace();
                } catch (FinderException e) {
                        e.printStackTrace();
                } catch (EJBException e) {
                        e.printStackTrace();
                } catch (RemoveException e) {
                        e.printStackTrace();
                }
        
        } 
  

ライフ・サイクル Bean の実装の準備が整ったら、リソースの作成時にライフ・サイクル・タスクがスケジュールされるように、計算機サービスのgetCalulator() メソッドを変更する必要があります。 getCalulator() メソッドを変更するには、リスト 8 に太字で示した 2 行のコードを追加します。 このサンプルでは、あらかじめサンプル・コードに組み込んだWSRL ヘルパー・クラス (WSRLHelper) を使用します。 scheduleResourceLifeCycleTask()メソッドは、Session Bean コンテキスト、有効期限、およびリソースの識別子(calcID) の各パラメーター指定とともに呼び出されます。


リスト 8. ライフ・サイクル・タスクのスケジューリングのための getCalculator()メソッドの変更
                
public javax.xml.soap.SOAPElement getCalculator(java.lang.String accountName)
{
    ...
    // Destroy the service after 30 seconds
    Date startDate = new Date(System.currentTimeMillis() + 30000);
    WSRLHelper.scheduleResourceLifeCycleTask(this.getSessionContext(), 
                                                         startDate, 
                                                             calcID);
    ...
}

WSRLHelper の使用に際しては、次の命名規則に従う必要があります。

  • ライフ・サイクル Bean の名前は、<ServiceName>ResourceLifeCycleTaskBeanの形式 (例 : CalculatorResourceLifeCycleTaskBean) とする。
  • サービス実装 Bean のリモート・インターフェースの名前は、<ServiceName>_RI.javaの形式 (例 : Calculator_RI.java) とする。

WSRL ヘルパーのすべてのソース・コードは、WASv5WSRLExtensions.jar に含まれています。

scheduleResourceLifeCycleTask() メソッドの処理手順は、次のとおりです。

1. ライフ・サイクル Bean のホームを検索します。 リスト 9 にこの手順を示しています。


リスト 9. ライフ・サイクル Bean のホームの検索
                
String taskId = null;
InitialContext ic = new InitialContext();
String className =
     stub.getEJBHome().getEJBMetaData().getRemoteInterfaceClass().getName();
                
// Lets remove the word Remote from the end
int index = className.lastIndexOf("Remote");
if(index != -1) className = className.substring(0, index);

index = className.lastIndexOf(".");
if(index != -1) className = className.substring(index + 1, className.length());

String lookupName = "java:comp/env/ejb/" 
                                +  className 
                                +  "ResourceLifeCycleTask";
                
// Get the Task handler home
TaskHandlerHome taskHandlerHome = getTaskHandlerHome(lookupName);


2. ResourceLifeCycleScheduler スケジューラーを把握します。 リスト 10 にこの手順を示しています。


リスト 10. スケジューラー・オブジェクトの取得
                
Scheduler scheduler = null;
try {
        InitialContext ic = new InitialContext();
        Object o = ic.lookup("java:comp/env/ResourceLifeCycleScheduler");
        scheduler =     
                  (Scheduler) PortableRemoteObject.narrow(o, Scheduler.class);
        } catch (NamingException e) {
                e.printStackTrace();
                }

3. スケジューラー上で createBeanTaskInfo() メソッドを使用して、BeanTaskInfoインターフェースのインスタンスを作成します。 TaskInfo インターフェースには、タスクの起動タイミングやそのタスクが起動した時に実行される作業内容などの、タスクの実行の各側面を制御するために使用できる、各種のset メソッドが含まれています。 リスト 11 にこの手順を示しています。


リスト 11. TaskInfo オブジェクトの設定
                

          // Create Task info   
          BeanTaskInfo taskInfo = scheduler.createBeanTaskInfo();
          taskInfo.setTaskHandler(taskHandlerHome);
taskInfo.setStartTime(startDate);       
taskInfo.setName(pKey);         


4. スケジューラー・インスタンスに対して実行依頼することにより、タスクを作成します。 リスト 12 にこの手順を示しています。


リスト 12. タスクの作成
                
          // Schedule Task
TaskStatus status = scheduler.create(taskInfo);

以上で、この記事の手順説明は終了です。 ここまで、WebSphere ApplicationServer, Enterprise Edition 内でスケジューラー・サービスを使用して WS-Resourceのスケジュール破棄を実装する方法について説明してきました。 今回の例では、30秒のインターバルをハードコーディングしました。 計算機 Web サービスに SetTerminationTimeオペレーションが実装されている場合は、そのオペレーションを呼び出すことによって、WS-Resourceクライアントにこのインターバルを設定させることも可能です。 SetTerminationTimeオペレーションおよびメッセージ交換については、WS-ResourceLifetime 仕様で定義されています。




上に戻る


まとめ

多数のリソースが存在する分散コンピューティング環境においては、サービス・リクエスターがリソースを必要としなくなった時点で、確実にそのリソースを破棄することが重要です。この記事では、WebSphere Application Server, Enterprise Edition の既存のツールおよびランタイム・サポートを利用することによって2 種類の WS-Resource 破棄メカニズムを実装する方法について説明しました。また、ライフ・サイクルのサポートを組み入れたリソースを構築するための、最低限のヘルパー・クラスとドキュメンテーションも提供しました。スケジューラー・サービスを利用しないソリューションも可能ですが、このソリューションでは、スケジューラーに任せることでタイマー処理の負担を軽減するとともに、J2EE環境内のスレッドに付随する問題を Web サービス実装に意識させないことによって、簡潔な実装が提供できます。新シリーズの記事では、WS-ResourceProperties や WS-ServiceGroup などの、その他のWS-Resource 仕様のプログラミング・モデル実装について論じる予定です。 後続記事は、developerWorksに掲載の予定です。





上に戻る


ダウンロード

内容ファイル名サイズダウンロード形式
ws-statefulws2code.zipws-statefulws2code.zip382KB  FTP
ダウンロード形式について


参考文献



著者について

Hidayatullah H. Shaikh is a senior software engineer on the IBM Software Group On-Demand Architecture and Development Team. His areas of interest and expertise include business process modeling and integration, service-oriented architectures, grid computing, e-commerce, J2EE technology, and database management (DBMSs) technologies. You can contact Hidayatullah at hshaikh@us.ibm.com.




記事の評価


サイト改善のため、ご意見をお寄せください。こちらのフォームからお願いいたします。



はいいいえわからない
 


 


54321
大変素晴らしい不充分・不完全である
 


上に戻る


    日本IBMについて プライバシー お問い合わせ