2.6.6 トランザクション制御
Reliable Messagingのアプリケーションはトランザクションマネジャでのトランザクション,およびローカルトランザクションを利用できます。ただし,トランザクションマネジャでのトランザクションとローカルトランザクションとを並行して利用することはできません。
例えば,トランザクションマネジャが制御しているときに次に示す状態のQueueSessionオブジェクトを,トランザクション属性がNotSupportedのメソッド内で利用しようとした場合,ローカルトランザクションを並行して利用することになるため例外が発生します。
-
QueueConnection.createQueueSession()メソッドのtransacted引数にtrueを指定したQueueSessionオブジェクト
-
QueueConnection.createQueueSession()メソッドのacknowledgeMode引数にCLIENT_ACKNOWLEDGEを指定したQueueSessionオブジェクト
- 〈この項の構成〉
(1) ローカルトランザクションの利用
キューセッションでのローカルトランザクションを利用する場合,QueueConnection.createQueueSession()メソッドのtransacted引数にtrueを指定します。
ローカルトランザクションの場合,Reliable Messagingのメッセージ送受信だけがトランザクションの対象になります。他製品が提供するリソースに対する操作は対象になりません。
(2) トランザクションマネジャでのトランザクションの利用
Reliable Messagingでは,トランザクションマネジャでのトランザクションを利用できます。次に示す場合,トランザクションマネジャでのトランザクションが発生します。
トランザクションマネジャでのトランザクションの場合,Reliable Messagingのメッセージ送受信だけでなく,他製品が提供するリソースに対する操作を含めたトランザクションが使用できます。
トランザクションマネジャでのトランザクションを使用する場合,Connector属性ファイルの<transaction-support>タグにLocalTransactionまたはXATransactionを指定してください。ただし,LocalTransactionを指定した場合,他製品が提供するリソースに対する操作を含めたトランザクションを使用できません。NoTransactionを指定した場合,トランザクションマネジャでのトランザクションを使用できません。Connector属性ファイルについては,マニュアル「アプリケーションサーバ リファレンス 定義編(アプリケーション/リソース定義)」を参照してください。
(3) トランザクションとメッセージ送信
メッセージ送信時のQueueSender.send()メソッドの動作について,トランザクションマネジャによってトランザクションが制御されていない場合と制御されている場合に分けて説明します。
-
トランザクションマネジャによって制御されていない場合
トランザクションマネジャによってトランザクションが制御されていない場合,QueueSender.send()メソッドの動作はQueueConnection.createQueueSession()メソッドのtransacted引数指定値によって異なります。
トランザクションマネジャによってトランザクションが制御されていない場合のsend()メソッドの動作を次の表に示します。
表2‒22 トランザクションマネジャによってトランザクションが制御されていない場合のsend()メソッドの動作 項番
transacted引数
動作内容
1
true
-
QueueSender.send()メソッドを発行するとキューセッションでのローカルトランザクションが開始されます。QueueSession.commit()メソッドを発行したときにメッセージ送信がコミットされます。
-
ローカルトランザクションが未決着の状態で,トランザクションマネジャでのトランザクションを開始すると例外が発生します。ローカルトランザクションが開始されていない状態であるなら,トランザクションを開始できます。
2
false
QueueSender.send()メソッドを発行すると,メッセージを正常に送信完了したときに自動的にコミットされます。
-
-
トランザクションマネジャによって制御されている場合
トランザクションマネジャによってトランザクションが制御されている場合,QueueSender.send()メソッドでのメッセージ送信はトランザクションマネジャでのトランザクションに含まれます。QueueSession.commit()またはrollback()メソッドを発行すると例外が発生します。
(4) トランザクションとメッセージ受信
メッセージの受信方式には,同期受信および非同期受信があります。
-
アプリケーションがQueueReceiver.receive()またはreceiveNoWait()メソッドを発行したタイミングでメッセージを受信します。
-
Message-driven Beanがキューを監視し,キューにメッセージが到着したタイミングでメッセージを受信します。
onMessage()メソッドのmessage引数によってメッセージを受信できます。この場合は,QueueConnection.createQueueSession()メソッドのacknowledgeMode引数にSession.AUTO_ACKNOWLEDGEを指定したときのQueueReceiver.receive()またはreceiveNoWait()メソッドの動作と同じ動作内容になります。Message-driven Beanとの連携については,「2.6.3 Message-driven Beanとの連携」を参照してください。
以降では,同期受信についてトランザクションマネジャによってトランザクションが制御されていない場合と制御されている場合に分けて説明します。
-
トランザクションマネジャによって制御されていない場合
トランザクションマネジャによってトランザクションが制御されていない場合,receive()およびreceiveNoWait()メソッドの動作はQueueConnection.createQueueSession()メソッドのtransactedおよびacknowledgeMode引数指定値によって異なります。
トランザクションマネジャによってトランザクションが制御されていない場合のreceive()およびreceiveNoWait()メソッドの動作を次の表に示します。
表2‒23 トランザクションマネジャによってトランザクションが制御されていない場合のreceive()およびreceiveNoWait()メソッドの動作 項番
transacted引数
acknowledgeMode引数
動作内容
1
true
−
-
QueueReceiver.receive()またはreceiveNoWait()メソッドを発行するとキューセッションでのローカルトランザクションが開始されます。QueueSession.commit()メソッドを発行したときにメッセージ受信が承認されます。
-
ローカルトランザクションが未決着の状態で,トランザクションマネジャでのトランザクションを開始すると例外が発生します。ローカルトランザクションが開始されていない状態であるなら,トランザクションマネジャでのトランザクションを開始できます。
2
false
AUTO_ACKNOWLEDGE
メッセージを正常に受信完了したとき,メッセージは自動的に承認されます。
3
DUPS_OK_ACKNOWLEDGE
4
CLIENT_ACKNOWLEDGE
Queue.Receiver()およびreceiveNoWait()メソッドでのメッセージの受信はローカルトランザクションに含まれます。
Message.acknowledge()メソッドを発行すると,同一のセッションで以前に受信して承認していないすべてのメッセージおよび現在のメッセージが承認されます。
QueueSession.recover()メソッドを発行すると,配送済みのメッセージが再度配送できるようになります。
Message.acknowledge()またはQueueSession.recover()メソッドを発行しないかぎり,トランザクションマネジャでのトランザクションを開始できません。
-
-
トランザクションマネジャによって制御されている場合
トランザクションマネジャによってトランザクションが制御されている場合,QueueReceiver.receive()およびreceiveNoWait()メソッドの動作はQueueConnection.createQueueSession()メソッドのtransactedおよびacknowledgeMode引数指定値によって異なります。
トランザクションマネジャによってトランザクションが制御されている場合のreceive()およびreceiveNoWait()メソッドの動作を次の表に示します。
表2‒24 トランザクションマネジャによってトランザクションが制御されている場合のreceive()およびreceiveNoWait()メソッドの動作 項番
transacted引数
acknowledgeMode引数
動作内容
1
true
−
QueueReceiver.receive()またはreceiveNoWait()メソッドでのメッセージの受信はトランザクションマネジャでのトランザクションに含まれます。
QueueSession.commit()またはrollback()メソッドを発行すると例外が発生します。
2
false
AUTO_ACKNOWLEDGE
3
DUPS_OK_ACKNOWLEDGE
4
CLIENT_ACKNOWLEDGE
QueueReceiver.receive()またはreceiveNoWait()メソッドでのメッセージの受信はトランザクションマネジャでのトランザクションに含まれます。
Message.acknowledge()またはQueueSession.recover()メソッドを発行すると例外が発生します。
(5) Application Serverのアウトプロセストランザクションサービスの利用
Application Serverのアウトプロセストランザクションサービスを使用し,XID再利用で最適化を行った場合,グローバルトランザクションで異なる二つのリソースアダプタ(別々にデプロイされた二つのReliable Messaging,Reliable MessagingとDB Connectorなど)から同一のDBに接続するコネクションを使用しないでください。
この構成にすると,リソースマネジャでエラーが発生する,または応答が返らないおそれがあります。XID再利用による最適化については,マニュアル「アプリケーションサーバ リファレンス 定義編(サーバ定義)」を参照してください。