ナビゲーションをスキップ

WebLogic JMS プログラマーズ ガイド

  前 次 前/次ボタンと目次ボタンとの区切り線 目次  

WebLogic JMS によるトランザクションの使い方

以下の節では、WebLogic JMS でトランザクションを使用する方法について説明します。

注意 : この節で説明する JMS クラスの詳細については、Sun Microsystems の Java Web サイトにある以下の最新の JMS 仕様と Javadoc を参照してください。http://java.sun.com/products/jms/docs.html

 


トランザクションの概要

トランザクションを使用すると、アプリケーションでは生成および消費されるメッセージのグループを調整し、送受信する複数のメッセージを基本単位として処理できます。

アプリケーションがトランザクションをコミットすると、トランザクション内で受信した全メッセージはメッセージング システムから削除され、トランザクション内で送信したメッセージが実際に配信されます。アプリケーションによってトランザクションがロールバックされた場合、トランザクション内で受信したメッセージはメッセージング システムに戻され、送信したメッセージは破棄されます。

トピック サブスクライバによってロールバックされた受信メッセージはサブスクライバに再配信されます。キュー レシーバによってロールバックされた受信メッセージは、コンシューマではなくキューに再配信されます。それによって、キュー内の他のコンシューマがメッセージを受信できるようにします。

たとえばオンライン ショッピングでは、品物を選択し、それをオンライン ショッピング カートに入れます。注文した品物はトランザクションの一部として格納されますが、チェックアウトして注文を確定するまでユーザの支払い義務は発生しません。ユーザはいつでも注文をキャンセルし、カートを空にすることができます。キャンセルによって、現在のトランザクション内で注文がロールバックされます。

JMS でトランザクションを使用する方法には以下の 3 種類があります。

1 つの JTA ユーザ トランザクションで複数の JMS サーバを有効にする場合、または JMS の処理と非 JMS の処理 (EJB など) を組み合わせる場合は、2 フェーズ コミット ライセンスが必要です。詳細については、「JTA ユーザ トランザクションの使い方」を参照してください。

以降の節では、JMS トランザクション セッションと JTA ユーザ トランザクションの使い方について説明します。

注意 : トランザクションを使用する場合、トランザクションがコミットまたはロールバックされる前に発生する問題に対処するために、「セッション例外リスナの定義」で説明しているようにセッション例外リスナを定義しておくことをお勧めします。

acknowledge() メソッドは、トランザクション内で呼び出されても無視されます。recover() メソッドがトランザクション内で呼び出されると、JMSException が送出されます。

 


JMS トランザクション セッションの使い方

JMS トランザクション セッションは、セッション内にあるトランザクションをサポートします。JMS トランザクション セッションのトランザクションはセッション外には影響を及ぼしません。たとえば、セッションをロールバックしても、そのセッションの送受信がロールバックされるだけで、データベース更新はロールバックされません。JTA ユーザ トランザクションは JMS トランザクション セッションでは無視されます。

JMS トランザクション セッションのトランザクションは、最初の送受信処理が発生した後で暗黙的に開始され、互いに結び付けられます。トランザクションをコミットまたはロールバックすると、他のトランザクションが自動的に始まります。

Administration Console オンライン ヘルプの「JMS : コンフィグレーション」の説明に従って、システム管理者は、JMS トランザクション セッションを使用する前に、アプリケーション開発環境の必要性に応じて、接続ファクトリの属性 (トランザクション タイムアウト) とセッション プールの属性 (トランザクション) を調整する必要があります。

JMS トランザクション セッションの設定および使用に必要な手順を次の図に示します。

図 5-1 JMS トランザクション セッションの設定と使用

JMS トランザクション セッションの設定と使用


 

手順 1 : JMS アプリケーションを設定し、トランザクション セッションを作成する

JMS アプリケーションの設定」の説明に従って JMS アプリケーションを設定しますが、「手順 3 : 接続を使用してセッションを作成する」でセッションを作成する際に、ブール値 transactedtrue に設定してセッションをトランザクション処理されるように指定します。

たとえば、PTP および Pub/sub メッセージング モデルのトランザクション セッションを作成する方法を次の各メソッドで示します。

   qsession = qcon.createQueueSession(
true,
Session.AUTO_ACKNOWLEDGE
);
   tsession = tcon.createTopicSession(
true,
Session.AUTO_ACKNOWLEDGE
);

定義したら、次のセッション メソッドでセッションをトランザクション処理するかどうかを決定できます。

   public boolean getTransacted(
) throws JMSException

注意 : acknowledge 値はトランザクション セッションでは無視されます。

手順 2 : 必要な処理を実行する

現在のトランザクションで必要な処理を実行します。

手順 3 : JMS トランザクション セッションをコミットまたはロールバックする

必要な処理を実行したら、以下のメソッドのいずれかを実行してトランザクションをコミットまたはロールバックします。

トランザクションをコミットするには、次のメソッドを実行します。

   public void commit(
) throws JMSException

commit() メソッドでは、現在のトランザクションの送受信メッセージがすべてコミットされます。受信メッセージはメッセージング システムから削除されますが、送信メッセージは表示されるようになります。

トランザクションをロールバックするには、次のメソッドを実行します。

   public void rollback(
) throws JMSException

rollback() メソッドでは、現在のトランザクションの送信メッセージがキャンセルされ、受信メッセージがメッセージング システムに戻されます。

commit() メソッドまたは rollback() メソッドが JMS トランザクション セッション以外で発行された場合、IllegalStateException が送出されます。

 


JTA ユーザ トランザクションの使い方

Java Transaction API (JTA) は、複数のデータ リソースにわたるトランザクションをサポートします。JTA は WebLogic Server の一部として実装され、トランザクション管理を実装するための標準 Java インタフェースを提供します。

トランザクションを開始、コミット、ロールバックするための javax.transaction.UserTransaction オブジェクトを使用して JTA ユーザ トランザクション アプリケーションをプログラミングします。JTA ユーザ トランザクション内に JMS と EJB を混在させる場合、『WebLogic JTA プログラマーズ ガイド』の「EJB アプリケーションのトランザクション」で説明しているとおりに EJB からトランザクションを開始することもできます。

トランザクション セッションの開始後に JTA ユーザ トランザクションを開始できます。ただし、JTA ユーザ トランザクションはトランザクション セッションに無視され、トランザクション セッションは JTA ユーザ トランザクションに無視されます。

WebLogic Server は 2 フェーズ コミット (2PC) プロトコルをサポートしています。2PC では、複数のリソース マネージャ間で 1 つの JTA トランザクションを効率的に調整できるようになります。これにより、トランザクションによる更新を関連するリソース マネージャのすべてでコミットするか、またはすべてのリソース マネージャから完全にロールバックし、トランザクション開始前の状態に戻すことで、データの完全性が保証されます。

注意 : このプロトコルをサポートするには、独自の 2PC トランザクション ライセンスが必要です。2PC が関連するトランザクションの移行の詳細については、「WebLogic JMS アプリケーションの移植」を参照してください。

Administration Console オンライン ヘルプの「[JMS 接続ファクトリ] --> [コンフィグレーション] --> [一般]」の説明に従って、システム管理者は、JTA トランザクション セッションを使用する前に、[ユーザ トランザクションを有効化] チェック ボックスをオンにして、JTA ユーザ トランザクションをサポートするように接続ファクトリをコンフィグレーションする必要があります。

JTA ユーザ トランザクションの設定および使用に必要な手順を次の図に示します。

図 5-2 JTA ユーザ トランザクションの設定と使用

JTA ユーザ トランザクションの設定と使用


 

手順 1 : JMS アプリケーションを設定し、非トランザクション セッションを作成する

JMS アプリケーションの設定」の説明に従って JMS アプリケーションを設定しますが、「手順 3 : 接続を使用してセッションを作成する」でセッションを作成する際に、ブール値 transactedfalse に設定してセッションをトランザクション処理されないように指定します。

たとえば、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");

手順 3 : JTA ユーザ トランザクションを開始する

UserTransaction.begin() メソッドを使用して JTA ユーザ トランザクションを開始します。次に例を示します。

xact.begin();

手順 4 : 必要な処理を実行する

現在のトランザクションで必要な処理を実行します。

手順 5 : JTA ユーザ トランザクションをコミットまたはロールバックする

必要な処理を実行したら、以下の commit() または rollback() メソッドを UserTransaction オブジェクトで実行して JTA ユーザ トランザクションをコミットまたはロールバックします。

トランザクションをコミットするには、次の commit() メソッドを実行します。

   xact.commit();

commit() メソッドを実行すると、WebLogic Server はトランザクション マネージャを呼びだしてトランザクションを完了し、現在のトランザクションで実行されている全処理をコミットします。トランザクション マネージャの役割は、リソース マネージャと協力してデータベースを更新することです。

トランザクションをロールバックするには、次の rollback() メソッドを実行します。

   xact.rollback();

rollback() メソッドを実行すると、WebLogic Server はトランザクション マネージャを呼び出してトランザクションをキャンセルし、現在のトランザクションで実行されている全処理をロールバックします。

commit() または rollback() メソッドを呼び出したら、xact.begin() を呼び出して別のトランザクションを開始することもできます。

 


メッセージ駆動型 Bean を使用した JTA ユーザ トランザクション内の非同期メッセージング

JMS では非同期的に配信されるメッセージでどのトランザクションを使用するかを決定できないため、JMS 非同期メッセージ配信は JTA ユーザ トランザクションではサポートされません。

ただし、メッセージ駆動型 Bean による代わりの方法が提供されます。メッセージ駆動型 Bean では、メッセージ配信の直前にユーザ トランザクションを自動的に開始できます。

メッセージ駆動型 Bean による非同期メッセージ配信については、『WebLogic エンタープライズ JavaBeans (EJB) プログラマーズ ガイド』の「メッセージ駆動型 EJB」を参照してください。

 


例 : JTA ユーザ トランザクションにおける JMS と EJB

以下の例では、JNDI を使用して javax.transaction.UserTransaction をルックアップすることにより、JTA ユーザ トランザクション内に EJB と JMS の処理が混在するようにアプリケーションを設定し、JTA ユーザ トランザクションを開始してからコミットする方法を示します。この例を実行するには、システム管理者が接続ファクトリをコンフィグレーションするときに、[XA コネクション ファクトリを有効化] チェック ボックスをオンにする必要があります。

注意 : この単純な JTA ユーザ トランザクションの例に加えて、WL_HOME\samples\server\examples\src\examples\jta\jmsjdbc ディレクトリにある WebLogic JTA 付属の例も参照してください。WL_HOME は、WebLogic Platform のインストール先の最上位ディレクトリです。

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()

 

フッタのナビゲーションのスキップ  ページの先頭 前 次