以下の節では、 WebLogic JMS で ト ラ ンザ ク シ ョ ン を使用する方法について説明 し ます。
ト ラ ンザ ク シ ョ ンの概要
JMS
ト ラ ンザ ク シ ョ ン セ ッ シ ョ ンの使い方
JTA
ユーザ ト ラ ンザ ク シ ョ ンの使い方メ ッ セージ駆動型 Bean を使用し た JTA ユーザ ト ラ ンザ ク シ ョ ン内の非同期 メ ッ セージン グ
例 : JTA ユーザ ト ラ ンザ ク シ ョ ンにおけ る JMS と EJB
注意: こ の節で説明する JMS ク ラ スの詳細については、 Sun Microsystems の
Java Web
サ イ ト にあ る以下の最新の JMS 仕様 と Javadoc を参照し て く だ さ い。 (http://java.sun.com/products/jms/docs.html)ト ラ ンザク シ ョ ンの概要
ト ラ ンザ ク シ ョ ンを使用する と 、 アプ リ ケーシ ョ ンでは生成および消費さ れ る メ ッ セージのグループを調整し、 送受信する複数の メ ッ セージを基本単位 と し て 処理で き ます。
アプ リ ケーシ ョ ンが ト ラ ンザ ク シ ョ ン を コ ミ ッ ト する と 、 ト ラ ンザ ク シ ョ ン内で 受信し た全 メ ッ セージは メ ッ セージ ング シ ス テムか ら削除さ れ、 ト ラ ンザ ク シ ョ ン内で送信し た メ ッ セージが実際に配信さ れます。 アプ リ ケーシ ョ ンに よ っ て ト ラ ンザ ク シ ョ ンが ロールバ ッ ク さ れた場合、 ト ラ ンザ ク シ ョ ン内で受信し た メ ッ セージは メ ッ セージング シ ス テムに戻さ れ、 送信し た メ ッ セージは破棄 さ れます。
5 WebLogic JMS
に よ る ト ラ ンザク シ ョ ンの使い方ト ピ ッ ク サブス ク ラ イ バに よ っ て ロールバ ッ ク さ れた受信 メ ッ セージはサブス ク ラ イ バに再配信 さ れます。 キ ュー レ シーバに よ っ て ロールバ ッ ク さ れた受信 メ ッ セージは、 コ ンシ ューマではな く キ ューに再配信さ れます。 それに よ っ て、
キ ュー内の他のコ ンシ ューマが メ ッ セージを受信で き る よ う に し ます。
た と えばオン ラ イ ン シ ョ ッ ピ ングでは、 品物を選択し、 それをオン ラ イ ン シ ョ ッ ピ ン グ カー ト に入れます。 注文し た品物は ト ラ ンザ ク シ ョ ンの一部 と し て格納 さ れますが、 チェ ッ ク ア ウ ト し て注文を確定する ま でユーザの支払い義務 は発生し ません。 ユーザはいつで も注文を キ ャ ンセル し、 カー ト を空にする こ と がで き ます。 キ ャ ンセルに よ って、 現在の ト ラ ンザ ク シ ョ ン内で注文が ロール バ ッ ク さ れます。
JMS
で ト ラ ンザ ク シ ョ ン を使用する方法には以下の 3 種類があ り ます。ト ラ ンザ ク シ ョ ンで JMS のみを使用する場合は、 JMS ト ラ ンザ ク シ ョ ン セ ッ シ ョ ン を作成で き ます。
EJB
な どの他の処理 と JMS を混在さ せる場合は、 JMS 非 ト ラ ンザ ク シ ョ ン セ ッ シ ョ ンで Java Transaction API (JTA) ユーザ ト ラ ンザ ク シ ョ ン を使用し ます。メ ッ セージ駆動型 Bean を使用し ます。
1
つの JTA ユーザ ト ラ ンザ ク シ ョ ンで複数の JMS サーバを有効にする場合、 ま たは JMS の処理 と 非 JMS の処理 (EJB な ど) を組み合わせる場合は、 2 フ ェー ズ コ ミ ッ ト ラ イ セン スが必要です。 詳細については、5-5
ページの 「JTA ユーザト ラ ンザ ク シ ョ ンの使い方」 を参照し て く だ さ い。
以降の節では、 JMS ト ラ ンザ ク シ ョ ン セ ッ シ ョ ン と JTA ユーザ ト ラ ンザ ク シ ョ ンの使い方について説明し ます。
注意: ト ラ ンザ ク シ ョ ン を使用する場合、 ト ラ ンザ ク シ ョ ンが コ ミ ッ ト ま たは ロールバ ッ ク さ れる前に発生する問題に対処する ために、
4-50
ページの「セ ッ シ ョ ン例外 リ スナの定義」 で説明し てい る よ う にセ ッ シ ョ ン例外 リ スナを定義し てお く こ と をお勧め し ます。
acknowledge() メ ソ ッ ド は、 ト ラ ンザ ク シ ョ ン内で呼び出さ れて も無視 さ れます。 メ ソ ッ ド が ト ラ ンザ ク シ ョ ン内で呼び出さ れる と 、
JMS
ト ラ ンザ ク シ ョ ン セ ッ シ ョ ンの使い方JMS ト ラ ンザク シ ョ ン セ ッ シ ョ ンの使い方
JMS
ト ラ ンザ ク シ ョ ン セ ッ シ ョ ンは、 セ ッ シ ョ ン内にあ る ト ラ ンザ ク シ ョ ンを サポー ト し ます。 JMS ト ラ ンザ ク シ ョ ン セ ッ シ ョ ンの ト ラ ンザ ク シ ョ ンはセ ッ シ ョ ン外には影響を及ぼ し ません。 た と えば、 セ ッ シ ョ ン を ロールバ ッ ク し て も、 そのセ ッ シ ョ ンの送受信が ロールバ ッ ク さ れ るだけで、 データベース更新は ロールバ ッ ク さ れません。 JTA ユーザ ト ラ ンザ ク シ ョ ンは JMS ト ラ ンザ ク シ ョ ン セ ッ シ ョ ンでは無視 さ れます。JMS
ト ラ ンザ ク シ ョ ン セ ッ シ ョ ンの ト ラ ンザ ク シ ョ ンは、 最初の送受信処理が 発生し た後で暗黙的に開始 さ れ、 互いに結び付け ら れます。 ト ラ ンザ ク シ ョ ン をコ ミ ッ ト ま たはロールバ ッ クする と 、 他の ト ラ ンザ ク シ ョ ンが自動的に始ま り ま す。
『管理者ガ イ ド 』 の 「
JMS
の管理」 の説明に従っ て、 シ ステ ム管理者は、 JMS ト ラ ンザ ク シ ョ ン セ ッ シ ョ ン を使用する前に、 アプ リ ケーシ ョ ン開発環境の必要 性に応じ て、 接続フ ァ ク ト リ の属性 ( ト ラ ンザ ク シ ョ ン タ イ ムア ウ ト ) と セ ッ シ ョ ン プールの属性 ( ト ラ ンザ ク シ ョ ン) を調整する必要があ り ます。JMS
ト ラ ンザ ク シ ョ ン セ ッ シ ョ ンの設定および使用に必要な手順を次の図に示 し ます。図5-1 JMS ト ラ ンザク シ ョ ンセ ッ シ ョ ンの設定と使用
5 WebLogic JMS
に よ る ト ラ ンザク シ ョ ンの使い方手順 1 : JMS アプ リ ケーシ ョ ンを設定し、 ト ラ ンザ ク シ ョ ン セ ッ シ ョ ン を作成する
4-4
ページの 「JMS アプ リ ケーシ ョ ンの設定」 の説明に従っ て JMS アプ リ ケー シ ョ ン を設定し ますが、4-8
ページの 「手順 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
値は ト ラ ンザ ク シ ョ ン セ ッ シ ョ ンでは無視さ れます。手順 2 : 必要な処理を実行する
現在の ト ラ ンザ ク シ ョ ンで必要な処理を実行し ます。
JTA
ユーザ ト ラ ンザ ク シ ョ ンの使い方手順 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 ユーザ ト ラ ン5 WebLogic JMS
に よ る ト ラ ンザク シ ョ ンの使い方ザ ク シ ョ ン内に JMS と EJB を混在さ せる場合、 『WebLogic JTA プ ロ グ ラ マーズ ガ イ ド 』 の 「
EJB
アプ リ ケーシ ョ ンの ト ラ ンザ ク シ ョ ン」 で説明し てい る と お り に EJB か ら ト ラ ンザ ク シ ョ ン を開始する こ と も でき ます。ト ラ ンザ ク シ ョ ン セ ッ シ ョ ンの開始後に JTA ユーザ ト ラ ンザ ク シ ョ ン を開始で き ます。 ただ し、 JTA ユーザ ト ラ ンザ ク シ ョ ンは ト ラ ンザ ク シ ョ ン セ ッ シ ョ ン に無視 さ れ、 ト ラ ンザ ク シ ョ ン セ ッ シ ョ ンは JTA ユーザ ト ラ ンザ ク シ ョ ンに無 視 さ れます。
WebLogic Server は 2 フ ェーズ コ ミ ッ ト (2PC) プ ロ ト コルをサポー ト し ていま
す。 2PC では、 複数の リ ソ ース マネージ ャ間で 1 つの JTA ト ラ ンザ ク シ ョ ン を 効率的に調整でき る よ う にな り ます。 こ れに よ り 、 ト ラ ンザ ク シ ョ ンに よ る更新 を関連する リ ソース マネージ ャ のすべてで コ ミ ッ ト するか、 ま たはすべての リ ソ ース マネージ ャか ら完全に ロール バ ッ ク し、 ト ラ ンザ ク シ ョ ン開始前の状態 に戻す こ と で、 データの完全性が保証さ れます。注意: こ のプロ ト コルをサポー ト するには、 独自の 2PC ト ラ ンザ ク シ ョ ン ラ イ セン スが必要です。 2PC が関連する ト ラ ンザ ク シ ョ ンの移行の詳細につ いては、
6-1
ページの 「WebLogic JMS アプ リ ケーシ ョ ンの移植」 を参照 し て く だ さ い。『Administration Console オン ラ イ ン ヘルプ』 の 「