まず、はい、私は自分の質問に答えています。ただし、アジマストリアンがなければ、私はどこにもいないことに注意することが重要です。どうもありがとうございます!
ONE: ConnectionFactory.SetReconnAttemptCount、SetReconnAttemptDelay、SetReconnAttemptTimeout を適切に設定する必要があります。デフォルト値では再試行が速すぎると思います (再試行の間に 1/2 秒程度)。当社の EMS サーバーは、ネットワーク ストレージなどが原因で、フェイルオーバーに時間がかかることがあります。そのため、1/2 秒間隔で 5 回の再試行では十分な長さではありません。
2: クライアント-サーバーおよびサーバー-クライアントのハートビートを有効にすることが重要だと考えています。確認できませんでしたが、それらが配置されていないと、サーバーがオフラインであるか、フェールオーバー モードに切り替わっているという通知をクライアントが受け取れない可能性があります。もちろん、これは EMS のサーバー側の設定です。
THREE: Tibems.SetExceptionOnFTSwitch(true); を設定することでフェイルオーバー イベントを監視できます。次に、例外イベント ハンドラを接続します。単一サーバー環境では、「接続が終了しました」というメッセージが表示されます。ただし、フォールト トレラントなマルチサーバー環境にいる場合は、次のように表示されます。この通知は厳密には必要ありませんが、役立つ場合があります (特にテストの場合)。
4: EMS のドキュメントでは明らかではありませんが、接続の再接続は単一サーバー環境では機能しません。マルチサーバーの耐障害性環境にいる必要があります。ただし、トリックがあります。同じサーバーを接続リストに 2 回入れることができます - 奇妙なことですが、それは機能し、組み込みの再接続ロジックが機能するようになります。
いくつかのコード:
private void initEMS()
{
Tibems.SetExceptionOnFTSwitch(true);
_ConnectionFactory = new TIBCO.EMS.TopicConnectionFactory(<server>);
_ConnectionFactory.SetReconnAttemptCount(30); // 30retries
_ConnectionFactory.SetReconnAttemptDelay(120000); // 2minutes
_ConnectionFactory.SetReconnAttemptTimeout(2000); // 2seconds
_Connection = _ConnectionFactory.CreateTopicConnectionM(<username>, <password>);
_Connection.ExceptionHandler += new EMSExceptionHandler(_Connection_ExceptionHandler);
}
private void _Connection_ExceptionHandler(object sender, EMSExceptionEventArgs args)
{
EMSException e = args.Exception;
// args.Exception = "Connection has been terminated" -- single server failure
// args.Exception = "Connection has performed fault-tolerant switch to <server url>" -- fault-tolerant multi-server
MessageBox.Show(e.ToString());
}