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