2.6.7 アプリケーション作成時の注意事項
Reliable Messagingのアプリケーションを作成するときの注意事項を次に示します。
なお,非永続版リソースアダプタの場合は,(2),(6),(8),および(9)の注意事項には該当しません。
(1) スレッド間でのオブジェクトの共有
QueueSessionオブジェクトおよびQueueSessionオブジェクトを使用して生成したオブジェクトを複数のスレッドやアプリケーションで共有できません。共有した場合の動作は保証されません。
(2) JDBCコネクション
(a) JDBCコネクションの消費
アプリケーションのリソースアダプタリファレンスの解決時に,サーブレットおよびJSPやEnterprise Beanの属性ファイルの<res-sharing-scope>タグに"Shareable"が指定されていない場合,Reliable MessagingではQueueSessionオブジェクトが一つ生成されるたびに,JDBCコネクションが一つ消費されます。このため,アプリケーションで使用しなくなったQueueSessionオブジェクトについては,必ずQueueSession.close()メソッドを発行してリソースを解放するようにしてください。属性ファイルについては,マニュアル「アプリケーションサーバ リファレンス 定義編(アプリケーション/リソース定義)」を参照してください。
ただし,Application Serverのコネクションプーリング機能を使用する場合はQueueSessionオブジェクト生成時にJDBCコネクションは再利用されます。QueueSession.close()メソッドで解放してもJDBCコネクションは継続して使用されます。
Message-driven Beanを使用する場合は,メッセージが配信されるとき,Message-driven Beanのインスタンスごとに一つのJDBCコネクションが消費されます。メッセージの配信が終了すると,リソースは解放されます。コネクションプーリング機能を使用している場合は,JDBCコネクションは解放されないでプールされます。
(b) トランザクションマネジャ内でのJDBCコネクションの利用
トランザクションマネジャでのトランザクション内では,最初にトランザクションに参加したJDBCコネクションが常に利用されます。つまり,2番目以降のJDBCコネクションに対する処理も,最初のJDBCコネクションを利用して行われるので注意が必要です。
(3) コネクションシェアリング時の指定
アプリケーションのリソースアダプタリファレンスの解決時に,サーブレットおよびJSPやEnterprise Beanの属性ファイルの<res-sharing-scope>タグに"Shareable"を指定し,かつ論理コネクション(java.sql.Connection,QueueSessionオブジェクト)を複数生成する場合は,QueueSessionオブジェクト生成時のtransacted引数にfalseを,acknowledgeMode引数にAUTO_ACKNOWLEDGEを指定してください。属性ファイルについては,マニュアル「アプリケーションサーバ リファレンス 定義編(アプリケーション/リソース定義)」を参照してください。
異なる引数を指定してQueueSessionオブジェクトを生成した場合,コネクションシェアリングが動作する契機で例外が発生します。
- 注意事項
-
アプリケーションがMessage-driven Beanの場合,アプリケーション内で1つだけ論理コネクションを生成する場合でも,コネクションシェアリングが動作する可能性があります。
Message-driven Beanではメッセージを配信する契機で論理コネクション(配信用コネクション)を1つ生成します。
この配信用コネクションとMessage-driven Bean内で生成される論理コネクションでシェアリングが行なわれる可能性があります。
配信用コネクションとコネクションシェアリングが行なわれる条件については,「付録G.1(1) MDBの場合」を参照してください。
(4) Message-driven Beanの監視対象のキュー
Message-driven Beanで監視するキューがシリアル取り出し属性の場合は,Message-driven Beanの多重度を2以上にしても性能面での効果はありません。多重度を上げてメッセージを配送する場合は監視するキューをパラレル取り出し属性にすることをお勧めします。
また,Message-driven Beanで監視するキューがシリアル取り出し属性の場合は,同一のキューに対するQueueReceiver.receive()メソッドを発行しないでください。発行するとデッドロックが発生します。
(5) Message-driven Bean使用時のトランザクションの指定
Message-driven Beanを使用する場合,Connector属性ファイルの<transaction-support>タグにXATransactionまたはLocalTransactionを指定してください。XATransactionまたはLocalTransaction以外を指定するとMessage-driven Beanアプリケーションのデプロイに失敗します。Connector属性ファイルについては,マニュアル「アプリケーションサーバ リファレンス 定義編(アプリケーション/リソース定義)」を参照してください。
(6) Message-driven BeanをBMTで使用するときのDB Connectorのステートメントプールの指定
Message-driven BeanをBMTで使用する場合,接続先がHiRDBで,かつXATransactionモードのときは,DB Connectorのステートメントプールを使用しないでください。DB Connectorのステートメントプール使用した場合,エラーメッセージとともにSQLException例外が発生することがあります。
(7) Message-driven Bean使用時のコネクションプーリング数の指定
Message-driven Beanを使用する場合,コネクションプーリング数がMessage-driven Beanの多重度よりも少ないと,性能が劣化することがあります。コネクションプーリング数は,Message-driven Beanの多重度よりも多くすることをお勧めします。
(8) 共用キュー
(a) 共用キューのアクセス順序
一つのトランザクション内で複数の共用キューにアクセスする場合,各アプリケーションでキューにアクセスする順序を統一する必要があります。異なる順序で共用キューにアクセスしようとすると,デッドロックが発生するおそれがあります。
(b) 受信用共用キューの利用
一つのトランザクション内で,同一の受信用共用キューに対する受信と送信を混在させないようにしてください。
(9) メッセージのサイズ制限
キュー間転送を行う場合,SOAP通信基盤のSOAPアタッチメントに関する仕様によって,転送するメッセージのサイズに制限が掛かる条件があります。制限の内容および制限が掛かる条件についてはSOAP通信基盤のドキュメントを参照してください。
(10) 参照渡し方式利用時のJMSメッセージの再利用
参照渡し方式を利用する場合,1度でも登録,取り出し,または参照したJMSメッセージに対しては,次の操作を実行しないでください。
-
メッセージの登録
-
登録したメッセージの再登録
-
登録したメッセージの更新メソッドおよびacknowledge()メソッドの呼び出し
-
登録したメッセージがBytesMessageの場合,ペイロードの参照メソッドの呼び出し
-
-
メッセージの取り出し
-
取り出したメッセージの登録
-
取り出したメッセージの更新メソッドの呼び出し
-
取り出しをコミットしたメッセージのacknowledge()メソッドの呼び出し
-
取り出しをロールバックしたメッセージのすべてのメソッドの呼び出し
-
-
メッセージの参照
-
参照したメッセージの登録
-
参照したメッセージの更新メソッドおよびacknowledge()メソッドの呼び出し
-
参照渡し方式利用時のJMSメッセージのメソッドの呼び出し可否を次の表に示します。
JMSメッセージのメソッドを呼び出すタイミング |
JMSメッセージのメソッドの呼び出し可否 |
|||
---|---|---|---|---|
参照メソッド |
更新メソッド |
acknowledge()メソッド |
||
登録後 |
send()メソッドの発行後 |
○※ |
× |
× |
commit()メソッドの発行後 |
○※ |
× |
× |
|
rollback()メソッドの発行後 |
○※ |
× |
× |
|
取り出し後 |
receive()メソッドの発行またはMDB配信後 |
○ |
× |
○ |
commit()メソッドまたはacknowledge()メソッドの発行後 |
○ |
× |
× |
|
rollback()メソッドまたはrecover()メソッドの発行後 |
× |
× |
× |
|
参照後 |
○ |
× |
× |
登録,取り出し,または参照したJMSメッセージに対して,呼び出せないメソッドを呼び出した場合の動作は保証できません。呼び出せないメソッドを呼び出した場合,ほかのセッションで取り出したメッセージの受信を承認(acknowledge)してしまう,メッセージデータが不正になる,例外が発生するなどの状態になることがあります。
登録に失敗したメッセージを再び登録したい場合は, 新たにJMSメッセージを作成し,作成したメッセージに,登録に失敗したメッセージに設定していた情報を設定し直して,登録してください。
(11) 参照渡し方式利用時のJMSメッセージの排他
参照渡し方式を利用する場合,JMSメッセージに対してsynchronizedによる排他を取らないでください。JMSメッセージで排他を取得した場合,デッドロックが発生するおそれがあります。
(12) JMSインターフェースの範囲
Reliable MessagingはJMS1.0.2で提供されているインタフェースの範囲で利用してください。JMS1.1で追加されたインタフェースを使用すると予期しない例外が発生するおそれがあります。