WebLogicアプリケーションまたはサーブレットからTuxedoに接続するようにJoltを設定するには、次の手順を実行する必要があります。
付録Bには、HTTPサーブレットから接続を確立し、Tuxedoサービスにアクセスする方法を示す単純なサンプル・プログラムがありますので参考にしてください。
Jolt Javaクラス・パッケージは、Jolt for WebLogic Serverのインストール時に自動的にインストールされます。Oracle Jolt for Oracle WebLogic Serverを使用するには、Joltと共にインストールされた次のクラス・パッケージをサーブレットにインポートします。
このほかにも、サーブレットにインポートする必要のあるクラスがあります。Javaサーブレットの作成方法については、
『WebLogic HTTPサーブレットのプログラミング』ガイドを参照してください。
セッション・プールには
SessionPoolManagerクラスからアクセスできます。WebLogic Serverでは、サーブレット・セッション・プールと呼ばれるセッション・プールを使用します。サーブレット・セッション・プールによって、HTTPサーブレット内で使用できる様々な機能を追加することができます。
WebLogic管理コンソールを使用してサーブレット・セッション・プールを構成すると、次の情報が
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を作成します。
WebLogic Serverの起動時にJoltセッション・プールを設定するように構成すると、JavaアプリケーションまたはサーブレットからJoltセッション・プールにアクセスして使用することができます。すでに説明したとおり、WebLogic Serverではすべての
ServletSessionPoolオブジェクトが同じ
ServletSessionPoolManagerによって管理されます。
ServletSessionPoolManager poolMgr = (ServletSessionPoolManager)
SessionPoolManager.poolmanager;
WebLogic Serverは、
SessionPoolManagerから呼び出された
ServletSessionPoolManagerクラスを使用します。
ServletSessionPoolManagerクラスは、HTTPサーブレット・メソッドを追加する
ServletSessionPoolオブジェクトを管理します。
SessionPoolManagerは、セッション・プールを管理するためのいくつかのメソッドを提供します。次の例では、
SessionPoolManagerを使用して、
joltpoolnameという名前の
SessionPoolを取得します。
SessionPool sPool = poolMgr.getSessionPool("joltpoolname");
WebLogic Serverはサブクラス
ServletSessionPoolManagerを使用するので、上の例では、
SessionPoolのかわりに実際には
ServletSessionPoolオブジェクトが返されます。
次のサンプル・コードに示すように、
SessionPoolを
ServletSessionPoolにキャストする必要があります。
ServletSessionPool ssPool =
(ServletSessionPool) poolMgr.getSessionPool("joltpoolname");
WebLogic Serverは
ServletSessionPoolManagerを作成して構成するため、ユーザーはこのクラスのみを使用する可能性が高くなります。
SessionPoolManagerメソッドを使用すると、管理対象のセッション・プールを個別または全体として作成、中断、停止、またはシャットダウンできます。WebLogic
config.xml構成ファイルを使用し、セッション・プールの構成と管理を行うことで、管理オペレーションをWebLogic Serverに委ねることをお薦めします。
プール・マネージャから指定した
ServletSessionPoolへの参照は、TuxedoのJolt Serverに対するセッション(または接続)のプールを表します。このプールのサイズと接続先のTuxedoシステムはアプリケーション・コードから抽出され、WebLogicの
config.xml構成ファイルで定義されます。リクエストが発行されると、
SessionPoolは使用可能な接続で、最も負荷の低い接続を使用します。
Joltリクエストは、通常
SessionPoolの
call()メソッドを使用するTuxedoサービスに対する1つの呼出しで構成されています。Tuxedoサービスに名前を付けて、
call()メソッドに一連のパラメータを設定すると、Tuxedoサービスから結果が返されます。1つのトランザクションで複数の呼出しを行うことにより、サーブレットがTuxedoアプリケーションのトランザクション要求に対応したり、データベース間の整合性を維持することができます。このトランザクションの詳細は、「トランザクションを使用する」で説明します。
ServletSessionPoolでは、オーバーロードした
call()メソッドをHTTPサーブレット内で使用できます。これらのメソッドは、
HttpServletRequestオブジェクトによって入力パラメータを受け取るので、HTTPサーブレットの
doPost()または
doGet()メソッドに渡された
HttpServletRequestオブジェクトと同じオブジェクトを受け取ることができます。ただし、この場合、HTTPでポストされた
name=valueの組合せが、Tuxedoサービスが要求する名前と一致している必要があります。これらのデータは最終的にJava Hashtableに変換されるので、名前の順序は識別されません。
HttpServletRequestに含まれるその他のデータによってTuxedoサービスが中断されることはありません。
Tuxedoサービスは、次のメソッドを使用してHTTPサーブレットから呼び出されます。
ssPool.call("
serviceName",
request);
ここで、
ssPoolは
ServletSessionPoolに対する参照、
"serviceName"は呼び出すTuxedoサービスの名前、
request引数はサーブレットに関連付けられた
HttpServletRequestオブジェクトを示します。
ServletSessionPool.call()メソッドは、
HttpServletRequestを内部で
ServletDataSet (通常の
SessionPoolに送信可能)に変換します。
Tuxedoサービスを呼び出す前に、パラメータ・セットにデータを追加することができます。たとえば、リクエストの日時を表すパラメータを追加する必要があるとします。
HttpServletRequestの
FORMデータからこのパラメータを受信するとは期待しません。そのかわり、サーブレットに追加してから、拡張データセットをTuxedoサービスに送信します。次のサンプル・プログラムでこの手順を説明します。
ServletDataSet dataset = new ServletDataSet();
// Import the HttpServletRequest into the dataset.
dataset.importRequest(request);
// Insert an extra parameter into the dataset.
dataset.setValue("REQUEST_TIME", (new Date()).toString());
// Send the dataset to the named service.
ssPool.call("service_name", dataset, null);
このサンプル・コードは、
HttpServletRequestオブジェクトを
ServletDataSetオブジェクトに手動で変換する方法を示しています。この新しい形式では、
setValue()メソッドを使用してパラメータを追加することができます。新しい値は、文字列で表されるキーに関連付けられています。次に、
SessionPoolから継承される
call()メソッドが呼び出されます。このメソッドは
ServletDataSetクラスを受け付けますが、トランザクションで使用するその他の引数を要求します。この最後のパラメータに
nullを指定すると、トランザクションを使用して複数のセッション呼出しをグループ化していないことを示します。詳細は、
「トランザクションを使用する」を参照してください。
Joltを使用してTuxedoサービスにアクセスする
Joltを使用して既存のTuxedoサービスにアクセスするには、Oracle Tuxedoサービス・メタデータ・リポジトリでサービスを定義してエクスポートする必要があります。詳細は、
Oracle Joltの使用を参照してください。Joltサービス定義では、Tuxedoアプリケーション・サービスによって要求されるパラメータを指定します。
Javaのデータ型をTuxedoのデータ型に変換する
次の表に、Javaのデータ型と、Tuxedoサービスで要求されるパラメータの型の対応を示します。
DataSetまたは
ServletDataSetの値には、適切なJavaのデータ型を使用してください。Javaの
String型としてパラメータを指定すると、メタデータ・リポジトリのサービス定義に応じて適切なデータ型に自動的に変換されます。
リクエストに関連付けられているすべてのパラメータは文字列形式で表されるので、この機能を使用して、
HttpServletRequestオブジェクト内のすべてのデータを変換することもできます。それ以外の場合は、下の表に示すデータ型を使用します。適切なデータ型を使用すると、文字列を変換するためのルックアップが不要になるので、効率が向上します。
Tuxedoの
CARRAY型は、Java文字列では各バイトが2桁の16進数で表されます。これらの16進数を連結して、複数のバイトを指定します。たとえば、文字列
FF0A20は、Tuxedoのデータ型では
CARRAY { 255, 10, 32 }で表されます。
ServletSessionPool.call()メソッドは、Tuxedoサービスの結果を含む
ServletResultオブジェクトを返します。サービス呼出しが失敗すると、例外がスローされます。このような例外を迅速に取得し、適切な処理を行う必要があります。発生する可能性のある例外については、
『Oracle Joltの使用』の付録A「Oracle Joltの例外」を参照してください。
次の例では、HTTPサーブレットの
ServletSessionPool.call()メソッドを使用して
ServletResultオブジェクトを取得します。
ServletResult sResult = ssPool.call("
service_name",
request);
この例では、
ssPoolは
ServletSessionPool、
requestは
HttpServletRequestになります。
ServletSessionPool.call()メソッドは、
Resultオブジェクトを返します。このオブジェクトは、
ServletResultオブジェクトとしてキャストする必要があります。
ServletResultオブジェクトによって、Java Stringとしてデータを取得するための追加メソッドが提供されます。
呼出しが成功したら、様々な形式の
getValue()メソッドを使用して
Resultまたは
ServletResultオブジェクトから個々のパラメータを取り出すことができます。
Result.getValue()メソッドを使用する
メタデータ・リポジトリの定義に応じて、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()メソッドを使用する
ServletResultは
Resultの機能を拡張し、追加のメソッドを提供します。
public String getStringValue(String name,
public String getStringValue(String name,
トランザクション・オブジェクトを使用して、複数のサービス呼出しを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()メソッドがスローする可能性のある例外とその理由を以下に示します。
•
|
bea.jolt.pool.ApplicationException
|
Tuxedoサービスのロジックでエラーが発生すると、この例外がスローされます。たとえば、クライアントがwithdrawalサービスを使用して、現在の残高を超える金額を不正に引き出そうとした場合などに発生します。Tuxedoサービスが
TPESVCFAILを戻すと、
ApplicationExceptionがスローされます。サービス呼出し時に返される
Resultオブジェクトに、アプリケーション固有のエラーに関する情報を含めることができます。
Resultオブジェクトには、
ApplicationException.getResult()メソッドを使用してアクセスできます。
Joltでは
bea.jolt.ApplicationExceptionというフル・パッケージ名で別の例外が定義されているので、この例外ではフル・パッケージ名
bea.jolt.pool.ApplicationExceptionを使用してください。
JoltExceptionは、以下に示すすべての例外のスーパー・クラスです。これらの例外はすべて、アプリケーション・ロジックに違反するシステム・エラーが発生したことを示します。
JoltExceptionについては、
Oracle Joltの使用のOracle Joltの例外に関する項を参照してください。
•
|
bea.jolt.pool.SessionPoolException
|
Joltのセッション・プールで例外が発生すると、この例外がスローされます。たとえば、すべてのセッションがビジー状態の場合や、セッション・プールが中断された場合などに発生します。
•
|
bea.jolt.ServiceException
|
アプリケーションを含むTuxedoサービスの起動に関するエラーが発生すると、この例外がスローされます。たとえば、サービスのタイムアウトや、存在しないサービスが呼び出された場合などに発生します。
•
|
bea.jolt.TransactionException
|
トランザクションの起動、コミット、または中止に失敗すると、この例外がスローされます。