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