WebLogicアプリケーションまたはサーブレットからTuxedoに接続するようにJoltを設定するには、次の手順を実行する必要があります。
付録Bには、HTTPサーブレットから接続を確立し、Tuxedoサービスにアクセスする方法を示す単純なサンプル・プログラムがありますので参考にしてください。
Jolt Javaクラス・パッケージは、Jolt for WebLogic Serverのインストール時に自動的にインストールされます。Oracle Jolt for Oracle WebLogic Serverを使用するには、Joltと共にインストールされた次のクラス・パッケージをサーブレットにインポートします。
bea.jolt.pool.*
bea.jolt.pool.servlet.*
このほかにも、サーブレットにインポートする必要のあるクラスがあります。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
を作成します。
プロパティ設定と定義の一覧については、「Joltスタートアップ・クラスおよび接続プール」を参照してください。
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サービスに送信します。次のサンプル・プログラムでこの手順を説明します。
// Create a new dataset
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リポジトリでサービスを定義してエクスポートする必要があります。詳細は、『Oracle Joltの使用』の「Joltリポジトリ・エディタの使用」および「Oracle Joltサービスのバルク・ロード」の項を参照してください。Joltサービス定義では、Tuxedoアプリケーション・サービスによって要求されるパラメータを指定します。
次の表に、Javaのデータ型と、Tuxedoサービスで要求されるパラメータの型の対応を示します。DataSet
またはServletDataSet
の値には、適切なJavaのデータ型を使用してください。JavaのString
型としてパラメータを指定すると、Joltリポジトリのサービス定義に応じて適切なデータ型に自動的に変換されます。
リクエストに関連付けられているすべてのパラメータは文字列形式で表されるので、この機能を使用して、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
オブジェクトから個々のパラメータを取り出すことができます。
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
はResult
の機能を拡張し、追加のメソッドを提供します。
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()
メソッドがスローする可能性のある例外とその理由を以下に示します。
bea.jolt.pool.ApplicationException
Tuxedoサービスのロジックでエラーが発生すると、この例外がスローされます。たとえば、クライアントがwithdrawalサービスを使用して、現在の残高を超える金額を不正に引き出そうとした場合などに発生します。TuxedoサービスがTPESVCFAIL
を戻すと、ApplicationException
がスローされます。サービス呼出し時に返されるResult
オブジェクトに、アプリケーション固有のエラーに関する情報を含めることができます。Result
オブジェクトには、ApplicationException.getResult()
メソッドを使用してアクセスできます。
Joltではbea.jolt.ApplicationException
というフル・パッケージ名で別の例外が定義されているので、この例外ではフル・パッケージ名bea.jolt.pool.ApplicationException
を使用してください。
bea.jolt.JoltException
JoltException
は、以下に示すすべての例外のスーパー・クラスです。これらの例外はすべて、アプリケーション・ロジックに違反するシステム・エラーが発生したことを示します。JoltException
については、Oracle Joltの使用のOracle Joltの例外に関する項を参照してください。
bea.jolt.pool.SessionPoolException
Joltのセッション・プールで例外が発生すると、この例外がスローされます。たとえば、すべてのセッションがビジー状態の場合や、セッション・プールが中断された場合などに発生します。
bea.jolt.ServiceException
アプリケーションを含むTuxedoサービスの起動に関するエラーが発生すると、この例外がスローされます。たとえば、サービスのタイムアウトや、存在しないサービスが呼び出された場合などに発生します。
bea.jolt.TransactionException