bea ホーム | 製品 | dev2dev | support | askBEA
BEA Logo Tuxedo
 ドキュメントのダウンロード   サイトマップ   用語集 
検索
0

WebLogic Server での Jolt の使用

 Previous Next Contents View as PDF  

Jolt for WebLogic のインプリメント

WebLogic アプリケーションまたはサーブレットから Tuxedo に接続するように Jolt を設定するには、次の手順を実行する必要があります。

付録 B の 1 ページには、HTTP サーブレットから接続を確立し、Tuxedo サービスにアクセスする方法を示す簡単なサンプル・プログラムがありますので参考にしてください。

 


パッケージをインポートする

Jolt Java クラス・パッケージは、Jolt for WebLogic Server のインストール時に自動的にインストールされます。BEA Jolt for BEA WebLogic Server を使用するには、Jolt と共にインストールされた次のクラス・パッケージをサーブレットにインポートします。

bea.jolt.pool.*
bea.jolt.pool.servlet.*

このほかにも、サーブレットにインポートする必要のあるクラスがあります。Java サーブレットの作成方法については、『WebLogic HTTP サーブレット プログラマーズ ガイド』を参照してください。

 


セッション・プールを設定する

セッション・プールには SessionPoolManager クラスからアクセスできます。WebLogic Server では、サーブレット・セッション・プールと呼ばれるセッション・プールを使用します。サーブレット・セッション・プールによって、HTTP サーブレット内で使用できるさまざまな機能を追加することができます。

WebLogic Administration Console を使用してサーブレット・セッション・プールを設定すると、次の情報が config.xml コンフィギュレーション・ファイルに追加されます。

<StartupClass
ClassName="bea.jolt.pool.servlet.weblogic.PoolManagerStartUp"
FailureIsFatal="false"
Name="MyStartup Class"
Targets="myserver"
/>
<JoltConnectionPool
ApplicationPassword="tuxedo"
MaximumPoolSize="5"
MinimumPoolSize="3"
Name="MyJolt Connection Pool"
PrimaryAddresses="//TUXSERVER:6309"
RecvTimeout="300"
SecurityContextEnabled="true"
Targets="myserver"
UserName="joltuser"
UserPassword="jolttest"
UserRole="clt"
/>

WebLogic を起動 (または再起動) すると、PoolManagerStartUp クラスと関連する startupArgs が呼び出されます。初回起動時には、PoolManagerStartUp クラスによって ServletSessionPoolManager オブジェクトが作成されます。このオブジェクトには、config.xml コンフィギュレーション・ファイルで設定された ServletSessionPool が含まれます。

以降の呼び出しでは、同じ ServletSessionPoolManager に別の ServletSessionPool が追加されます。前の例に示すように、セッション・プールごとに一意の仮想名をバインディングしてエントリを追加する必要があります。WebLogic Server は、config.xml ファイルの定義に応じて新しい ServletSessionPool を作成します。

プロパティ設定と定義の一覧については、Jolt スタートアップ・クラスおよび接続プールを参照してください。

サーブレット・セッション・プールにアクセスする

WebLogic Server の起動時に Jolt セッション・プールを設定するように指定すると、Java アプリケーションまたはサーブレットから Jolt セッション・プールにアクセスして使用することができます。既に説明したとおり、WebLogic Server ではすべての ServletSessionPool オブジェクトが同じ ServletSessionPoolManager によって管理されます。

  ServletSessionPoolManager poolMgr = (ServletSessionPoolManager) 
    SessionPoolManager.poolmanager;

WebLogic Server は、SessionPoolManager から派生した ServletSessionPoolManager クラスを使用します。ServletSessionPoolManagerServletSessionPool オブジェクトを管理します。このオブジェクトは追加の HTTP サーブレット・メソッドを提供します。

SessionPoolManager は、セッション・プールを管理するためのいくつかのメソッドを提供します。次の例では、SessionPoolManager を使用して、joltpoolname という名前の SessionPool を取得します。

  SessionPool sPool = poolMgr.getSessionPool("joltpoolname");

WebLogic Server はサブクラス ServletSessionPoolManager を使用するので、上の例では、SessionPool の代わりに実際には ServletSessionPool オブジェクトが返されます。

次のコード例に示すように、SessionPoolServletSessionPool にキャストする必要があります。

  ServletSessionPool ssPool =
    (ServletSessionPool) poolMgr.getSessionPool("joltpoolname");

WebLogic Server が ServletSessionPoolManager を作成して設定するので、大部分の場合はこのメソッドだけを使用しますが、ほかの SessionPoolManager メソッドを使用して、個々のセッション・プールまたはすべてのセッション・プールを、作成、中断、停止、またはシャットダウンすることができます。WebLogic の config.xml コンフィギュレーション・ファイルを使用してセッション・プールを設定および管理して、これらの管理タスクを WebLogic Server で処理することをお勧めします。

 


サーブレット・セッション・プールを使用する

プール・マネージャから指定した ServletSessionPool への参照は、Tuxedo の Jolt Server に対するセッション (または接続) のプールを表します。このプールのサイズと接続先の Tuxedo システムはアプリケーション・コードから抽出され、WebLogic の config.xml コンフィギュレーション・ファイルで定義されます。要求が発行されると、SessionPool は使用可能な接続で、最も負荷の低い接続を使用します。

Tuxedo サービスを呼び出す

Jolt 要求は、通常 SessionPoolcall() メソッドを使用する Tuxedo サービスに対する 1 つの呼び出しで構成されています。Tuxedo サービスに名前を付けて、call() メソッドに一連のパラメータを設定すると、Tuxedo サービスから結果が返されます。1 つのトランザクションで複数の呼び出しを行うことにより、サーブレットが Tuxedo アプリケーションのトランザクション要求に対応したり、データベース間の整合性を維持することができます。このトランザクションの詳細については、3-9 ページの「トランザクションを使用する」で説明します。

ServletDataSet を送信する

ServletSessionPool では、オーバーロードした call() メソッドを HTTP サーブレット内で使用できます。これらのメソッドは、HttpServletRequest オブジェクトによって入力パラメータを受け取るので、HTTP サーブレットの doPost() または doGet() メソッドに渡された HttpServletRequest オブジェクトと同じオブジェクトを受け取ることができます。ただし、この場合、HTTP でポストされた name=value の組み合わせが、Tuxedo サービスが要求する名前と一致している必要があります。これらのデータは最終的に Java Hashtable に変換されるので、名前の順序は識別されません。HttpServletRequest に含まれるその他のデータによって Tuxedo サービスが中断されることはありません。

Tuxedo サービスは、次のメソッドを使用して HTTP サーブレットから呼び出されます。

    ssPool.call("serviceName", request);

ここで、ssPoolServletSessionPool に対する参照、"serviceName" は呼び出す Tuxedo サービスの名前、request 引数はサーブレットに関連付けられた HttpServletRequest オブジェクトを示します。

ServletSessionPool.call() メソッドは、HttpServletRequest を内部で ServletDataSet (通常の SessionPool に送信可能) に変換します。

データ・セットにパラメータを追加する

Tuxedo サービスを呼び出す前に、パラメータ・セットにデータを追加することができます。たとえば、要求の日時を表すパラメータを追加したい場合、このパラメータは HttpServletRequestFORM データからは取得できません。このような場合、日時を表すパラメータをサーブレットに追加して、追加されたデータ・セットを Tuxedo サービスに送信します。次の例は、この手順を示しています。

  // 新しいデータ・セットの作成
  ServletDataSet dataset = new ServletDataSet();
  // HttpServletRequest をデータ・セットにインポート
  dataset.importRequest(request);
  // 追加のパラメータをデータ・セットに挿入
  dataset.setValue("REQUEST_TIME", (new Date()).toString());
  // データ・セットを指定したサービスに送信
  ssPool.call("service_name", dataset, null);

このコード例は、HttpServletRequest オブジェクトを ServletDataSet オブジェクトに手動で変換する方法を示しています。この新しい形式では、setValue() メソッドを使用してパラメータを追加することができます。新しい値は、文字列で表されるキーに関連付けられています。次に、SessionPool から継承される call() メソッドが呼び出されます。このメソッドは ServletDataSet クラスを受け付けますが、トランザクションで使用するその他の引数を要求します。この最後のパラメータに null を指定すると、トランザクションを使用して複数のセッション呼び出しをグループ化していないことを示します。詳細については、 トランザクションを使用するを参照してください。

 


Jolt を使用して Tuxedo サービスにアクセスする

Jolt を使用して既存の Tuxedo サービスにアクセスするには、Jolt リポジトリでサービスを定義してエクスポートする必要があります。詳細については、『BEA Jolt』の「Jolt リポジトリ・エディタを使う」および「大量の BEA Tuxedo サービス定義をロードする」を参照してください。Jolt サービス定義では、Tuxedo アプリケーション・サービスによって要求されるパラメータを指定します。

 


Java のデータ型を Tuxedo のデータ型に変換する

次の表に、Java のデータ型と、Tuxedo サービスで要求されるパラメータの型の対応を示します。DataSet または ServletDataSet の値には、適切な Java のデータ型を使用してください。Java の String 型としてパラメータを指定すると、Jolt リポジトリのサービス定義に応じて適切なデータ型に自動的に変換されます。

要求に関連付けられているすべてのパラメータは文字列形式で表されるので、この機能を使用して、HttpServletRequest オブジェクト内のすべてのデータを変換することもできます。それ以外の場合は、下の表に示すデータ型を使用します。適切なデータ型を使用すると、文字列を変換するためのルックアップが不要になるので、効率が向上します。

BEA Tuxedo のデータ型

Java のデータ型

char

Byte

short

Short

long

Integer

float

Float

double

Double

char*

String

CARRAY

byte[ ]

XML

byte[ ]

Tuxedo の CARRAY 型は、Java 文字列では各バイトが 2 桁の 16 進数で表されます。これらの 16 進数を連結して、複数のバイトを指定します。たとえば、文字列 FF0A20 は、Tuxedo のデータ型では CARRAY { 255, 10, 32 } で表されます。

 


サービスから結果を受信する

ServletSessionPool.call() メソッドは、Tuxedo サービスの結果を含む ServletResult オブジェクトを返します。サービス呼び出しが失敗すると、例外がスローされます。このような例外を迅速に把握し、適切な処理を行う必要があります。発生する可能性のある例外については、『BEA Jolt』の「BEA Jolt の例外」を参照してください。

次の例では、HTTP サーブレットの ServletSessionPool.call() メソッドを使用して ServletResult オブジェクトを取得します。

  ServletResult sResult = ssPool.call("service_name", request);

この例では、ssPoolServletSessionPoolrequestHttpServletRequest になります。

ServletSessionPool.call() メソッドによって Result オブジェクトが返されます。このオブジェクトは、ServletResult オブジェクトとしてキャストする必要があります。ServletResult オブジェクトは、Java 文字列でデータを取得するメソッドを提供します。

呼び出しが成功したら、さまざまな形式の getValue() メソッドを使用して Result または ServletResult オブジェクトから個々のパラメータを取り出すことができます。

Result.getValue() メソッドを使用する

Jolt リポジトリの定義に応じて、Tuxedo サービスのパラメータに対応するキーを指定することにより、ServletResult からデータが取り出されます。適切な getValue() メソッドにキーを指定すると、対応する値のオブジェクトが返されます。

また、Result.getValue() メソッドは、キーのルックアップが失敗すると、デフォルト値のオブジェクトを返します。返されたオブジェクトは、Tuxedo サービスの定義に応じて適切なデータ型にキャストする必要があります。たとえば、次のコードでは、

  Integer answer = (Integer) resultSet.getValue("Age", null);

キー "Age" を指定して ServletResult で返された値に整数 answer を設定するか、ServletResult にこのキーが存在しない場合は null を返します。Tuxedo と Java のデータ型の対応については、Java のデータ型を Tuxedo のデータ型に変換するの表を参照してください。

キーに関連付けられた値の配列を指定することができます。この場合、getValue() メソッドによって、そのインスタンスにある配列の最初の要素が返されます。次のコードでは、

  public Object getValue(String name, int index, Object defVal)

このメソッドのシグニチャを使用して、配列内の特定のインデックス指定要素を参照します。

ServletResult.getStringValue() メソッドを使用する

ServletResultResult の機能を拡張し、追加のメソッドを提供します。

  public String getStringValue(String name,
                               int index,
                               String defVal)
                             
  public String getStringValue(String name,
                               String defVal)

これらのメソッドは、Result クラスの getValue() メソッドと同様に動作しますが、該当する値のオブジェクトを Java 文字列型で返します。CARRAY は、Java のデータ型を Tuxedo のデータ型に変換するで説明したように、2 桁の 10 進数の文字列に変換されます。

 


トランザクションを使用する

トランザクション・オブジェクトを使用して、複数のサービス呼び出しを 1 つのアクションにグループ化し、アプリケーション・ロジック内でデータの整合性を維持することができます。次のメソッドを使用してセッション・プールからトランザクションを取得します。

  Transaction trans = ssPool.startTransaction(timeout);

トランザクション・オブジェクト trans は、トランザクションに対する参照を保持します。ssPool は SessionPool または ServletSessionPool オブジェクトになり、トランザクションの timeout 引数は秒単位で指定します。

トランザクションによってセッションが取得されると、そのトランザクションがコミットまたはアボートされるか、タイムアウトになるまで、ほかのトランザクションはそのセッションを使用できません。ただし、トランザクションには含まれない単独の要求によって使用することはできます。トランザクションがプールからセッションを取得できなかった場合、このメソッドは bea.jolt.pool.TransactionException をスローします。セッション・プールが中断されると、メソッドは bea.jolt.pool.SessionPoolException をスローします。

アプリケーションで call() メソッドを使用するごとに、最後のパラメータでトランザクション・オブジェクトを指定する必要があります。次に例を示します。

  ssPool.call("svcName", request, trans);

1 つのトランザクションで複数の呼び出しを行うことができます。この呼び出しは、トランザクション・オブジェクトのメソッドを使用してトランザクションをコミットまたはロールバックするまで完了しません。trans.commit() メソッドによってトランザクションが完了します。このメソッドは、コミットが成功した場合は 0 を返し、失敗した場合は TransactionException をスローします。

トランザクションをアボートする必要がある場合は、Transaction.rollback() メソッドを使用します。このメソッドは、トランザクションのアボートを試みます。アボートが成功した場合は 0 を返し、失敗した場合は TransactionException をスローします。

例外の処理

Jolt による Tuxedo サービスの呼び出し開始時にエラーや障害が発生した場合、Java の例外を使用してアプリケーションに報告されます。常に try / catch ブロックに call() メソッドを入れ、例外が発生した場合は適切な処理を行う必要があります。call() メソッドがスローする可能性のある例外とその理由を以下に示します。

 

Back to Top Previous Next
Contact e-docsContact BEAwebmasterprivacy