異常時のメッセージ退避機能とは
本機能は受信対象種別がJMSの場合に有効な機能です。
トランザクション管理種別がContainerで、かつ、トランザクション属性がRequiredの場合、Message-driven Bean内でjava.lang.RuntimeExceptionやjava.lang.Error、またはそれらのサブクラスのシステム例外が発生すると、コンテナはトランザクションをロールバックします。
この場合、ロールバックされたメッセージは再度Message-driven Beanに送信され、処理がループする場合があります。
この現象を回避するために、異常時のメッセージ退避機能を使用してください。
Message-driven Bean内でjava.lang.RuntimeExceptionやjava.lang.Error、またはそれらのサブクラスのシステム例外がリトライ回数+1回連続して発生すると、コンテナがメッセージをバックアップ用のDestinationへ送信します。
異常時ループ対処用のJMSコネクションファクトリ名とDestination名が指定されていない場合や、指定が間違えているなどの場合には、メッセージはシリアライズされ、シリアライズファイルが作成されます。
シリアライズに失敗した場合は、プロセスを停止します。
設定方法
[異常時メッセージ退避定義]の“リトライカウント”、“JMSコネクションファクトリ名”、“Destination名”は、Interstage管理コンソールまたはisj2eeadminコマンドで設定します。
設定方法の詳細は、Interstage管理コンソールのヘルプを参照してください。
シリアライズファイル
以下に、シリアライズファイルのファイル名と格納先を示します。
MSG_[EJBアプリケーション名]_[プロセスID]_[スレッドID]_[数字].ser
C:\Interstage\EJB\var
/opt/FJSVejb/var
処理概要
以下に、この機能を使用した場合の処理イメージを示します。
例
シリアライズファイルの復元方法
シリアライズされたJMSメッセージを復元するための記述例を示します。
FileInputStream fis = new FileInputStream("シリアライズファイル名"); try { ObjectInputStream ois = new ObjectInputStream(fis); Message msg = (Message)ois.readObject(); //このmsgが退避されたメッセージです。 } finally { fis.close(); }
注意
以下の場合には、異常が発生したメッセージではないメッセージが退避の対象となる可能性がありますので、使用しないでください。
Point-To-Pointモデルモデルを使用し、Message-driven BeanのDestinationに他の受信アプリケーションが存在する場合
JMSメッセージに以下のJMSヘッダーフィールドが指定された場合
JMSPriority
JMSExpiration
以下に該当する場合、リトライ回数を超過してもメッセージ受信を繰り返す可能性があります。
Point-To-Pointモデルメッセージングモデル
不揮発化チャネルを利用
イベントサービスの設定について
イベントチャネルのイベントデータをメモリにキャッシュする数は、以下の式が成立するように設定してください。
イベントチャネルのイベントデータをメモリにキャッシュする数 > イベントチャネルに蓄積できるイベントデータの最大値
設定はイベントサービス運用コマンドを使用して行います。詳細は“リファレンスマニュアル(コマンド編)”の“essetcnf”および“essetcnfchnl”を参照してください。