BEA Logo BEA Tuxedo Release 8.0

  BEA ホーム  |  イベント  |  ソリューション  |  パートナ  |  製品  |  サービス  |  ダウンロード  |  ディベロッパ・センタ  |  WebSUPPORT

 

   Tuxedo ホーム   |   BEA Jolt   |   先頭へ   |   前へ   |   次へ   |   目次   |   索引

 


Jolt クラス・ライブラリの使い方

Jolt クラスを使用すると、ログオン/ログオフ、同期型のサービス呼び出し、トランザクションの開始、トランザクションのコミット、トランザクションのロールバックなどの基本的なトランザクション処理を実行できます。次の節では、これらの機能を実行するための Jolt クラスの使い方を説明します。

Jolt クラス・ライブラリを使用して、マルチスレッド化されたアプリケーションを開発したり、Tuxedo 固有のバッファ型を定義したり、イベントや任意通知型メッセージのサブスクライブを実行することもできます。これらの機能については、後の節で説明します。

ログオン/ログオフ

クライアント・アプリケーションには、トランザクション処理を行う前に BEA Tuxedo 環境にログオンしておく必要があります。Jolt クラス・ライブラリには、BEA Tuxedo システムとの接続を確立するための JoltSessionAttributes クラスと JoltSession クラスが用意されています。

JoltSessionAttributes クラスには、さまざまなプロパティのほか、Jolt および BEA Tuxedo システムへの接続プロパティが格納されます。接続を確立するには、クライアント・アプリケーション側で JoltSession クラスのインスタンスを作成する必要があります。このインスタンスが JoltSession オブジェクトです。開発者が Jolt セッションおよび BEA Tuxedo オブジェクトをインスタンス化すると、Jolt および BEA Tuxedo のログオン機能が有効になります。endSession メソッドを呼び出すと、セッションは終了し、ユーザのログオフが可能になります。

同期型のサービス呼び出し

要求や応答などのトランザクションは、JoltRemoteService オブジェクト (JoltRemoteService クラスのインスタンス) を使用して処理されます 。各 JoltRemoteService オブジェクトは、エクスポートされた BEA Tuxedo の要求/応答サービスを参照します。JoltRemoteService オブジェクトを使用する前には、サービス名と JoltSession オブジェクトを指定して、JoltRemoteService オブジェクトをインスタンス化しておく必要があります。

JoltRemoteService オブジェクトを使用するには、次の手順に従います。

  1. 入力パラメータを設定します。

  2. サービスを呼び出します。

  3. 出力パラメータを検証します。

効率を高めるため、Jolt では入力パラメータ・オブジェクトはコピーされません。オブジェクトへの参照 (文字列とバイト配列) だけが保存されます。JoltRemoteService オブジェクトは、状態を持つオブジェクトです。そのため、このオブジェクトの入力パラメータとリクエスト属性は、オブジェクトの寿命がある限り維持されます。JoltRemoteService オブジェクトを再利用する前に、clear() メソッドを使用して、属性や入力パラメータをリセットできます。

Jolt はマルチスレッド環境用に設計されているので、Java のマルチスレッド機能を使用して複数の JoltRemoteService オブジェクトを同時に呼び出すことができます。詳細については、「マルチスレッド・アプリケーション」 を参照してください。

トランザクションの開始、コミット、およびロールバック

Jolt では、トランザクションは JoltTransaction クラスのオブジェクトとして表されます。トランザクションは、トランザクション・オブジェクトがインスタンス化されると開始されます。次に示すように、トランザクション・オブジェクトの作成時には、タイムアウト値と JoltSession オブジェクトのパラメータが設定されます。

trans = new JoltTransaction(timeout, session)

Jolt では、トランザクションに関与するすべてのサービスに対して明示的なトランザクション・モデルを使用します。トランザクション・サービスを呼び出すには、JoltTransaction オブジェクトがパラメータとして必要です。また、サービスとトランザクションが同じセッションに属していることも必要です。Jolt では、同じセッションにバインドされていないサービスとトランザクションを使用することはできません。

リストの「Jolt のファンド転送の例 (SimXfer.java)」のコード例は、Jolt クラス・ライブラリの使い方を示しています。ここでは、JoltSessionAttributes、JoltSession、JoltRemoteService、およびJoltTransaction クラスを使用しています。

例では、ユーザ定義された 2 つの BEA Tuxedo サービス (WITHDRAWAL と DEPOSIT) をバインドして、TRANSFER トランザクションを擬似的に実行します。WITHDRAWAL 操作が失敗した場合は、ロールバックが実行されます。それ以外の場合は DEPOSIT が実行され、commit によりトランザクションが完了します。

リストの「Jolt のファンド転送の例 (SimXfer.java)」のコード例に示すトランザクション・プロセスのプログラミング手順は、以下のとおりです。

  1. ホスト名やポート番号などの接続属性を JoltSessionAttribute オブジェクトに設定 します。

    コード・リストで次の行を参照してください。

    sattr = new JoltSessionAttributes();

  2. sattr.checkAuthenticationLevel() を使うと、サーバへのログオンに必要 なセキュリティ・レベルをアプリケーション側で決定できます。

    コード・リストで次の行を参照してください。

    switch (sattr.checkAuthenticationLevel())

  3. JoltSession オブジェクトをインスタンス化してログオンします。

    コード・リストで次の行を参照してください。

    session = new JoltSession (sattr, userName, userRole, 
    userPassword, appPassword);

    この例では、SessionException エラーを明示的にキャッチしません。

  4. すべての JoltRemoteService 呼び出しでは、サービスの指定と JoltSession() か ら返されたセッション・キーが必要です。

    コード・リストで次の行を参照してください。

    withdrawal = new JoltRemoteService("WITHDRAWAL", session);
    deposit = new JoltRemoteService("DEPOSIT", session);

    これらの呼び出しは、Jolt リポジトリに格納されている WITHDRAWAL および DEPOSIT のサービス定義を、withdrawal オブジェクトおよび deposit オブジェクトにそれぞれバインドします。WITHDRAWAL および DEPOSIT サービスが Jolt リポジトリで定義されていないと、ServiceException がスローされます。この例では、ServiceException エラーを明示的にキャッチしません。

  5. サービス定義が返されると、アプリケーション固有のフィールド (アカウント番 号を示す ACCOUNT_ID や引き出し額を示す SAMOUNT など) に自動的に値が設 定されます。

    コード・リストで次の行を参照してください。

    withdrawal.addInt("ACCOUNT_ID", 100000);
    withdrawal.addString("SAMOUNT", "100.00");

    add*() メソッドでは、IllegalAccessError または NoSuchFieldError 例外がスローされる場合があります。

  6. JoltTransaction 呼び出しでは、指定した時間内にトランザクションが完了しない場 合のタイムアウト値を指定できます。

    コード・リストで次の行を参照してください。

    trans = new JoltTransaction(5,session);

  7. withdrawal サービスの定義が自動的に設定された後で withdrawal.call(trans)メソッドを呼び出すと、withdrawalサービスが呼び 出されます。

    コード・リストで次の行を参照してください。

    withdrawal.call(trans);

  8. 失敗した WITHDRAWAL はロールバックできます。

    コード・リストで次の行を参照してください。

    trans.rollback();

  9. または、いったん DEPOSIT が実行されると、すべてのトランザクションがコ ミットされます。コード・リストで次の行を参照してください。
    deposit.call(trans);
    trans.commit();

次のリストは、Jolt クラスを使用してファンドを転送する簡単なアプリケーションの例です。

Jolt のファンド転送の例 (SimXfer.java)

/* Copyright 1999 BEA Systems, Inc. All Rights Reserved */ 
import bea.jolt.*; 
public class SimXfer 
{ 
public static void main (String[] args) 
{ 
JoltSession session; 
JoltSessionAttributes sattr; 
JoltRemoteService withdrawal; 
JoltRemoteService deposit; 
JoltTransaction trans; 
String userName=null; 
String userPassword=null; 
String appPassword=null; 
String userRole="myapp"; 
        sattr = new JoltSessionAttributes(); 
sattr.setString(sattr.APPADDRESS, "//bluefish:8501"); 
        switch (sattr.checkAuthenticationLevel())		  
{ 
case JoltSessionAttributes.NOAUTH: 
System.out.println("NOAUTH¥n"); 
break; 
case JoltSessionAttributes.APPASSWORD: 
appPassword = "appPassword"; 
break; 
case JoltSessionAttributes.USRPASSWORD: 
userName = "myname";  
userPassword = "mysecret"; 
appPassword = "appPassword"; 
break; 
} 
sattr.setInt(sattr.IDLETIMEOUT, 300); 
session = new JoltSession(sattr, userName, userRole, 
userPassword, appPassword); 
// 転送をシミュレートする。 
withdrawal = new JoltRemoteService("WITHDRAWAL", session); 
deposit = new JoltRemoteService("DEPOSIT", session); 
        withdrawal.addInt("ACCOUNT_ID", 100000); 
withdrawal.addString("SAMOUNT", "100.00"); 
        // トランザクションの開始。タイムアウトは 5 秒
trans = new JoltTransaction(5, session); 
try 
{ 
withdrawal.call(trans); 
} 
        catch (ApplicationException e) 
{ 
e.printStackTrace(); 
// このサービスでは STATLIN フィールドを
// クライアント・アプリケーションのエラー報告に使用する。
System.err.println(withdrawal.getStringDef("STATLIN","NO  
STATLIN")); 
System.exit(1); 
} 
        String wbal = withdrawal.getStringDef("SBALANCE", "$-1.0"); 
        // 文字列を浮動小数に変換する前に "$" 記号を削除する。
float w = Float.valueOf(wbal.substring(1)).floatValue(); 
if (w < 0.0) 
{ 
System.err.println("Insufficient funds"); 
trans.rollback(); 
System.exit(1); 
} 
else // ファンドの預け入れ/転送をする。
{ 
deposit.addInt("ACCOUNT_ID", 100001); 
deposit.addString("SAMOUNT", "100.00"); 
            deposit.call(trans); 
String dbal = deposit.getStringDef("SBALANCE", "-1.0"); 
trans.commit(); 
            System.out.println("Successful withdrawal"); 
System.out.println("New balance is:" + wbal); 
            System.out.println("Successful deposit"); 
System.out.println("New balance is:" + dbal); 
} 
        session.endSession(); 
System.exit(0); 
} // end main 
} // end SimXfer

 

先頭へ戻る 前のトピックへ 次のトピックへ