イベントサービスでアプリケーション運用中に異常が発生した場合の対処方法について説明します。
コンシューマアプリケーション運用中に異常が発生した場合、発生したタイミングにより対処を行う必要があります。また、対処方法は、コンシューマアプリケーションが接続情報を保存している場合としていない場合で異なるため、それぞれについて説明します。
アプリケーション運用中にコネクションが切断される場合
アプリケーション運用中に、ユーザ例外「Disconnected」が復帰された場合、イベントチャネルの作成時に「コネクション情報を自動回収する処理」を有効と設定(esmkchnlコマンド実行時に-autodisconオプションを指定)したため、CORBAサービスのクライアント側無通信監視時間超過によりコネクションが切断された可能性があります。
アプリケーションを継続して運用する場合は、イベントチャネルへの接続から行ってください。
コンシューマアプリケーションの異常終了(接続情報を保存している場合)
■イベントデータの待合せ中に異常終了した場合
イベントチャネルは、イベントデータ待合せ中のコンシューマアプリケーションが異常終了しても、イベントチャネル内ではproxyのイベントデータの待合せ状態が解除されず、サプライヤからイベントデータが送信されるまで(またはイベントデータの待合せ時間まで)、イベントデータを待ち合わせます。このため、コンシューマアプリケーションの再起動後に、同一proxyで受信処理を行った場合は、イベントチャネル内でpullメソッド/pull_waitメソッドが2重に発行されることになり、以下の例外が復帰される可能性があります。
システム例外:BAD_PARAM マイナーコード:0x464a09e5
本現象が発生した場合、pull_cancelメソッドを発行し、イベントデータの待合せ状態を解除した後に、pullメソッドおよびpull_waitメソッドを発行してください。
■トランザクション運用でイベントデータ受信後、commit/rollback処理前に異常終了した場合
トランザクション運用中のアプリケーションが異常終了しても、イベントチャネルはトランザクションのタイムアウト時間までトランザクション処理中となります。
このため、受信済みのイベントデータを再受信する場合は、必ずrollbackメソッドを発行後にbeginメソッドを発行して再度トランザクション処理を行ってください。
なお、トランザクション処理中にdisconnectメソッドを発行した場合、イベントチャネルは自動的にcommit処理を実行します。
コンシューマアプリケーションの異常終了(接続情報を保存していない場合)
■トランザクション運用中、イベントデータ受信後、commit/rollback処理前に異常終了した場合
Point-To-Pointモデルの運用など、コンシューマアプリケーションが接続情報を保存せずに、コンシューマの起動ごとにproxyを作成してローカルトランザクションを実施している場合、ローカルトランザクションのタイムアウト時間に大きい値を設定していると、前回受信したデータ(トランザクションが完了していない状態のデータ)を早く受信できません。
以下のどちらかの対処を行ってください。本対処によりトランザクションタイムアウトを早く検出し、前回受信したデータ(トランザクションが完了していない状態のデータ)を早く受信できます。
イベントチャネル起動前に、essetcnfchnlコマンド(-ltrntimeオプション指定)で、ローカルトランザクションのタイムアウト時間を300秒程度(初期設定値:300秒)に変更します。
イベントサービス起動前に、essetcnfコマンド(-ltrntimeオプション指定)で、ローカルトランザクションのタイムアウト時間を300秒程度(初期設定値:300秒)に変更します。
なお、イベントチャネルの不揮発チャネル運用中の場合は、トランザクションタイムアウトの検出を待たずに、イベントチャネルの再起動を行うことにより、ローカルトランザクションは解除され、前回受信したイベントデータを復元できます。
動的イベントチャネルとの通信時に、システム例外「COMM_FAILURE」およびマイナーコード「0x464a01ec/0x464a09ec」が復帰される場合
動的イベントチャネルとの通信時に、Windows(R)の場合はイベントログ上、Solaris/Linuxの場合はシステムログ上に、エラーメッセージod10939が出力された場合は、以下のインタフェースに指定したホスト名またはポート番号に誤りがある可能性があります。
イベントサービス使用時
C言語の場合:EventFactory_create()
C++言語の場合:EventFactory::create()
Java言語の場合:com.fujitsu.ObjectDirector.EventService.EventFactory.create()
COBOLの場合:EVENTFACTORY-CREATE
ノーティフィケーションサービス使用時
C言語の場合:CosNotifyChannelAdmin_EventChannelFactory_create_channel()
C++言語の場合:CosNotifyChannelAdmin::EventChannelFactory::create_channel()
Java言語の場合:org.omg.CosNotifyChannelAdmin.EventChannelFactory.create_channel()
COBOLの場合:COSNOTIFYCHANNELADMIN-EVENTCHANNELFACTORY-CREATE-CHANNEL
アプリケーションプログラムにおいて、上記のインタフェースに指定したホスト名およびポート番号に誤りがないかを確認してください。
また、当該イベントファクトリを停止する場合は、esstopfctryコマンドを以下のオプションで実行し、すべての動的イベントチャネルを停止してください。
esstopfctry -o off
動的イベントチャネルの作成が遅延して、エラーメッセージod10942が出力される場合
イベントファクトリは、1プロセスかつ1スレッドのシングルスレッドのサービスであるため、同時に複数の要求を処理できません。アプリケーションがイベントファクトリに同時に複数の処理要求を発行した場合、2件目以降の処理要求はCORBAサービスにキューイングされ、イベントファクトリの処理が可能になるまで待ち状態となります。このため、アプリケーションがイベントファクトリに大量の処理要求を発行した場合、キューイング中のリクエストにタイムアウトが通知されて、エラーメッセージod10942が出力される可能性があります。
イベントファクトリに大量の処理要求を発行する場合は、エラーメッセージod10942の出力を抑止するため、エラーメッセージod10942のユーザの対処を行ってください。エラーメッセージod10942のユーザの対処については、「メッセージ集」の「メッセージ番号がodで始まるメッセージ」-「od10900番台のメッセージ」-「od10942」を参照してください。
その他
イベントサービスのアプリケーションは、CORBAサービスのアプリケーションです。アプリケーション運用中に異常が発生した場合、「第11章 CORBAサービス使用時の異常」-「11.4 アプリケーションがエラーとなる」も参考にして対処してください。なお、Java言語のアプリケーション作成時の環境設定ORBおよび環境変数CLASSPATHの設定については、「アプリケーション作成ガイド(イベントサービス編)」の「アプリケーションの開発(Java言語)」-「アプリケーションの作成方法」-「クライアントアプリケーションの作成方法」も参照してください。