![]() |
![]() |
|
|
| |
WebLogic JMS によるトランザクションの使い方
以下の節では、WebLogic JMS でトランザクションを使用する方法について説明します。
注意: この節で説明する JMS クラスの詳細については、Sun Microsystems Java Web サイトにある以下の JMS Javadoc(最新の JMS API Errata を含む)を参照してください。
http://www.javasoft.com/products/jms/Javadoc-102a/index.html
および
トランザクションを使用すると、アプリケーションでは生成および消費されるメッセージのグループを調整し、送受信する複数のメッセージを基本単位として処理できます。
アプリケーションがトランザクションをコミットすると、トランザクション内で受信した全メッセージはメッセージング システムから削除され、トランザクション内で送信したメッセージが実際に配信されます。アプリケーションによってトランザクションがロールバックされた場合、トランザクション内で受信したメッセージはメッセージング システムに戻され、送信したメッセージは破棄されます。
トピック サブスクライバによってロールバックされた受信メッセージはサブスクライバに再配信されますキュー レシーバによってロールバックされた受信メッセージは、コンシューマではなくキューに再配信されます。それによって、キュー内の他のコンシューマがメッセージを受信できるようにします。
たとえばオンライン ショッピングでは、品物を選択し、それをオンライン ショッピング カートに入れます。注文した品物はトランザクションの一部として格納されますが、チェックアウトして注文を確定するまでユーザの支払い義務は発生しません。ユーザはいつでも注文をキャンセルし、カートを空にすることができます。キャンセルによって、現在のトランザクション内で注文がロールバックされます。
JMS でトランザクションを使用する方法には以下の 3 種類があります。
1 つの JTA ユーザ トランザクションで複数の JMS サーバを有効にする場合、または JMS の処理と 非 JMS の処理(EJB など)を組み合わせる場合は、2 フェーズ コミット ライセンスが必要です。詳細については、 JTA ユーザ トランザクションの使い方を参照してください。
以降の節では、JMS トランザクション セッションと JTA ユーザ トランザクションの使い方について説明します。
注意: トランザクションを使用する場合、トランザクションがコミットまたはロールバックされる前に発生する問題に対処するために、 セッション例外リスナの定義で説明しているようにセッション例外リスナを定義しておくことをお勧めします。
acknowledge()
メソッドは、トランザクション内で呼び出されても無視されます。recover()
メソッドがトランザクション内で呼び出されると、JMSException が送出されます。
JMS トランザクション セッションは、セッション内にあるトランザクションをサポートします。JMS トランザクション セッションのトランザクションはセッション外には影響を及ぼしません。たとえば、セッションをロールバックしても、そのセッションの送受信がロールバックされるだけで、データベース更新はロールバックされません。JTA ユーザ トランザクションは JMS トランザクション セッションでは無視されます。
JMS トランザクション セッションのトランザクションは、最初の送受信処理が発生した後で暗黙的に開始され、互いに結び付けられます。トランザクションをコミットまたはロールバックすると、他のトランザクションが自動的に始まります。
『管理者ガイド』の「JMS の管理」の説明に従って、システム管理者は、JMS トランザクション セッションを使用する前に、アプリケーション開発環境の必要性に応じて、接続ファクトリの属性(トランザクション タイムアウト)とセッション プールの属性(トランザクション)を調整する必要があります。
JMS トランザクション セッションの設定および使用に必要な手順を次の図に示します。
図5-1 JMS トランザクション セッションの設定と使用
手順 1 : JMS アプリケーションを設定し、トランザクション セッションを作成する
JMS アプリケーションの設定の説明に従って JMS アプリケーションを設定しますが、
手順 3 : 接続を使用してセッションを作成するでセッションを作成する際に、ブール値 transacted
を true
に設定してセッションをトランザクション処理されるように指定します。
たとえば、PTP および Pub/sub メッセージング モデルのトランザクション セッションを作成する方法を次の各メソッドで示します。
qsession = qcon.createQueueSession(
true,
Session.AUTO_ACKNOWLEDGE
);
tsession = tcon.createTopicSession(
true,
Session.AUTO_ACKNOWLEDGE
);
定義したら、次のセッション メソッドでセッションをトランザクション処理するかどうかを決定できます。
public boolean getTransacted(
) throws JMSException
注意: acknowledge 値はトランザクション セッションでは無視されます。
現在のトランザクションで必要な処理を実行します。
手順 3 : JMS トランザクション セッションをコミットまたはロールバックする
必要な処理を実行したら、以下のメソッドのいずれかを実行してトランザクションをコミットまたはロールバックします。
トランザクションをコミットするには、次のメソッドを実行します。
public void commit(
) throws JMSException
commit()
メソッドでは、現在のトランザクションの送受信メッセージがすべてコミットされます。受信メッセージはメッセージング システムから削除されますが、送信メッセージは表示されるようになります。
トランザクションをロールバックするには、次のメソッドを実行します。
public void rollback(
) throws JMSException
rollback()
メソッドでは、現在のトランザクションの送信メッセージがキャンセルされ、受信メッセージがメッセージング システムに戻されます。
commit()
メソッドまたは rollback()
メソッドが JMS トランザクション セッション以外で発行された場合、IllegalStateException
が送出されます。
Java Transaction API(JTA)は、複数のデータ リソースにわたるトランザクションをサポートします。JTA は WebLogic Server の一部として実装され、トランザクション管理を実装するための標準 Java インタフェースを提供します。
トランザクションを開始、コミット、ロールバックするための javax.transaction.UserTransaction オブジェクトを使用して JTA ユーザ トランザクション アプリケーションをプログラミングします。JTA ユーザ トランザクション内に JMS と EJB を混在させる場合、『WebLogic JTA プログラマーズ ガイド』で説明しているとおりに EJB からトランザクションを開始することもできます。
トランザクション セッションの開始後に JTA ユーザ トランザクションを開始できます。ただし、JTA ユーザ トランザクションはトランザクション セッションに無視され、トランザクション セッションは JTA ユーザ トランザクションに無視されます。
WebLogic Server は 2 フェーズ コミット(2PC)プロトコルをサポートしています。2PC では、複数のリソース マネージャ間で 1 つの JTA トランザクションを効率的に調整できるようになります。これにより、トランザクションによる更新を関連するリソース マネージャのすべてでコミットするか、またはすべてのリソース マネージャから完全にロール バックし、トランザクション開始前の状態に戻すことで、データの完全性が保証されます。
注意: このプロトコルをサポートするには、独自の 2PC トランザクション ライセンスが必要です。2PC が関連するトランザクションの移行の詳細については、 WebLogic JMS アプリケーションの移行を参照してください。
『管理者ガイド』の「JMS の管理」の説明に従って、システム管理者は、JTA トランザクション セッションを使用する前に、[ユーザ トランザクションを有効化] チェック ボックスをオンにして、JTA ユーザ トランザクションをサポートするように接続ファクトリをコンフィグレーションする必要があります。
JTA ユーザ トランザクションの設定および使用に必要な手順を次の図に示します。
図5-2 JTA ユーザ トランザクションの設定と使用
手順 1 : JMS アプリケーションを設定し、非トランザクション セッションを作成する
JMS アプリケーションの設定の説明に従って JMS アプリケーションを設定しますが、
手順 3 : 接続を使用してセッションを作成するでセッションを作成する際に、ブール値 transacted
を false
に設定してセッションをトランザクション処理されないように指定します。
たとえば、PTP および Pub/sub メッセージング モデルの非トランザクション セッションを作成する方法を次の各メソッドで示します。
qsession = qcon.createQueueSession(
false,
Session.AUTO_ACKNOWLEDGE
);
tsession = tcon.createTopicSession(
false,
Session.AUTO_ACKNOWLEDGE
);
注意: ユーザ トランザクションがアクティブな場合、確認応答モードは無視されます。
手順 2 : JNDI でユーザ トランザクションをルックアップする
アプリケーションは、JNDI を使用して、WebLogic Server ドメインの UserTransaction
オブジェクトに対するオブジェクト参照を返します。
JNDI コンテキスト(context
)を確立して次のようなコードを実行すると、UserTransaction
オブジェクトをルックアップできます。
UserTransaction xact = ctx.lookup("javax.transaction.UserTransaction");
UserTransaction.begin()
メソッドを使用して JTA ユーザ トランザクションを開始します。次に例を示します。
xact.begin();
現在のトランザクションで必要な処理を実行します。
手順 5 : JTA ユーザ トランザクションをコミットまたはロールバックする
必要な処理を実行したら、以下のメソッドのいずれかを実行して JTA ユーザ トランザクションをコミットまたはロールバックします。
トランザクションをコミットするには、次のメソッドを実行します。
xact.commit();
commit()
メソッドを実行すると、WebLogic Server はトランザクション マネージャを呼びだしてトランザクションを完了し、現在のトランザクションで実行されている全処理をコミットします。トランザクション マネージャの役割は、リソース マネージャと協力してデータベースを更新することです。
トランザクションをロールバックするには、次のメソッドを実行します。
xact.rollback();
rollback()
メソッドを実行すると、WebLogic Server はトランザクション マネージャを呼びだしてトランザクションをキャンセルし、現在のトランザクションで実行されている全処理をロールバックします。
commit()
または rollback()
メソッドを呼び出したら、xact.begin()
を呼び出して別のトランザクションを開始することもできます。
メッセージ駆動型 Bean を使用した JTA ユーザ トランザクション内の非同期メッセージング
JMS では非同期的に配信されるメッセージでどのトランザクションを使用するかを決定できないため、JMS 非同期メッセージ配信は JTA ユーザ トランザクションではサポートされません。
ただし、メッセージ駆動型 Bean による代わりの方法が提供されます。メッセージ駆動型 Bean では、メッセージ配信の直前にユーザ トランザクションを自動的に開始できます。
メッセージ駆動型 Bean による非同期メッセージ配信については、『WebLogic エンタープライズ JavaBeans プログラマーズ ガイド』を参照してください。
例 : JTA ユーザ トランザクションにおける JMS と EJB
以下の例では、JNDI を使用して javax.transaction.UserTransaction
をルックアップすることにより、JTA ユーザ トランザクション内に EJB と JMS の処理が混在するようにアプリケーションを設定し、JTA ユーザ トランザクションを開始してからコミットする方法を示します。この例を実行するには、システム管理者が接続ファクトリをコンフィグレーションするときに、[ユーザ トランザクションを有効化] チェック ボックスをオンにする必要があります。
注意: この単純な JTA ユーザ トランザクションの例に加えて、samples
\examples
\jta
\jmsjdbc
ディレクトリにある WebLogic JTA も参照してください。
javax.transaction.UserTransaction パッケージを含む適切なパッケージをインポートします。
import java.io.*;
import java.util.*;
import javax.transaction.UserTransaction;
import javax.naming.*;
import javax.jms.*;
JTA ユーザ トランザクション変数などの必要な変数を定義します。
public final static String JTA_USER_XACT=
"javax.transaction.UserTransaction";
.
.
.
手順 1
非トランザクション セッションを作成して、JMS アプリケーションを設定します。JMS アプリケーションの設定については、 JMS アプリケーションの設定を参照してください。
// JMS アプリケーションの設定手順の例は次のとおり
qsession = qcon.createQueueSession(false,
Session.CLIENT_ACKNOWLEDGE);
手順 2
JNDI で UserTransaction
をルックアップします。
UserTransaction xact = (UserTransaction)
ctx.lookup(JTA_USER_XACT);
手順 3
JTA ユーザ トランザクションを開始します。
xact.begin();
手順 4
必要な処理を実行します。
// JMS および EJB 処理をここで実行
手順 5
JTA ユーザ トランザクションをコミットします。
xact.commit()
![]() |
![]() |
![]() |