19.2.4 イベントリスナに関する留意事項
イベントリスナに関する留意事項を次に示します。
(1) イベントリスナの実装に関する留意事項
-
イベントが発生した場合,クラスタイベントリスナおよびノードイベントリスナは,EADSクライアントに追加した順序(ead_add_cluster_eventlistener()およびead_add_node_eventlistener()で追加した順序)で実行されます。
-
イベントリスナ内では,次の関数を呼び出さないでください。
-
ead_init_client()
-
ead_init_client_n()
-
ead_terminate_client()
-
-
クラスタイベントリスナの引数に指定されたead_cluster_eventcontext構造体を指すポインタは,クラスタイベントリスナの実行後に自動で解放されます。そのため,クラスタイベントリスナの終了後に,このポインタを参照しないでください。クラスタイベントリスナの終了後に,このポインタを参照した場合,動作は保証されません。
-
ノードイベントリスナの引数に指定されたead_node_eventcontext構造体を指すポインタは,ノードイベントリスナの実行後に自動で解放されます。そのため,ノードイベントリスナの終了後に,このポインタを参照しないでください。ノードイベントリスナの終了後に,このポインタを参照した場合,動作は保証されません。
-
イベントリスナ内には,EADSクライアントの正常な処理に影響を及ぼす処理(例えば,リソースを大量に消費する処理)を実装しないでください。
-
同一EADSクライアント内のすべてのイベントリスナは,1つのスレッドから呼び出されて動作します。イベントリスナの動作中は,EADSサーバから受信したデータの保持用にメモリを占有します。そのため,イベントリスナ内には,長時間動作する処理を実装しないでください。
(2) イベントの通知に関する留意事項
-
EADSサーバが初期化状態(initialized)以降の状態の場合に,EADSサーバからEADSクライアントにイベントが通知されます。ただし,EADSサーバとのコネクションの再接続に成功した場合は,EADSサーバの状態に関係なく,そのEADSサーバがまだ通知していないイベントが通知されます。
-
EADSクライアントがクラスタ内のどのEADSサーバとも通信できなかった場合は,イベントが通知されません。ただし,EADSクライアントはEADSサーバとのコネクションの再接続を繰り返すため,再接続に成功すると,そのあとでイベントが通知されます。
-
半数以上のEADSサーバが縮退している場合,イベントが通知されないことがあります。
-
EADSクライアントとEADSサーバ間のコネクションで,切断と再接続を繰り返した場合や,通信が遅延している場合には,イベントの通知が遅延します。
-
EADSクライアントとEADSサーバ間のコネクションが切断している間に,複数のEADSサーバが縮退した場合,EADSサーバのイベント再送時間(サーバ定義のeads.server.eventListener.notify.retry.timeoutパラメタの指定値)を過ぎて再送用のデータが破棄されると,イベントを通知する順序が逆転するおそれがあります。
-
EADSクライアントとEADSサーバ間のコネクションが切断している間に,あるEADSサーバが縮退後に復旧した場合,EADSサーバのイベント再送時間(サーバ定義のeads.server.eventListener.notify.retry.timeoutパラメタの指定値)を過ぎて再送用のデータが破棄されると,何もイベントが通知されないおそれがあります。
-
同じプロセス内で,EADSクライアントを終了(ead_terminate_client())したあとにEADSクライアントを開始(ead_init_client()またはead_init_client_n())した場合は,すでに終了したEADSクライアントの再送用のデータは破棄されています。そのため,EADSクライアントを開始したあとのイベントだけが通知されます。
-
EADSサーバの処理は,EADSクライアントとの通信路の状態とは関係なく進みます。そのため,EADSクライアントへのイベントの通知が完了していなくても,クラスタの終了(eztool stop)やEADSサーバの縮退などの処理は完了します。