質問

2〜4台のサーバー環境で組み込みのサーバーフェールオーバーを使用するTIBCO EMSソリューションがあります。 TIBCOが1つのEMSサーバーから別のEMSサーバーへのフェールオーバーサービスを管理する場合、EMSサービスレベルで接続が新しいサーバーに自動的に転送されることになっています。 EMSサービスを使用するC#アプリケーションの場合、これは発生していません。フェイルオーバー後にユーザー接続が新しいサーバーに転送されていないため、理由はわかりません。

起動時のEMSへのアプリケーション接続のみ。ユーザーがアプリケーションを起動した後にTIBCO管理者がフェイルオーバーを行う場合、ユーザーは新しいサーバーに再接続するためにアプリを再起動する必要があります(EMS接続は、実稼働EMSサーバー-最初の試行が失敗した場合、文字列内の次のサーバーに移動して再試行します。

接続が切断されていることを検出した場合、EMSへの定期的な再接続を試行する自動化アプローチを探していますが、最善の方法はわかりません。

アイデアはありますか? TIBCO.EMS.dllバージョン4.4.2および.Net 2.x(SmartClientアプリ)を使用しています

ご協力いただければ幸いです。

役に立ちましたか?

解決

この投稿では、現在のコメントを要約し、私のアプローチをより詳細に説明する必要があります...

TIBCOの「ConnectionFactory」および「Connection」タイプは、重量級のスレッドセーフタイプです。 TIBCOでは、 1つ ConnectionFactory(サーバーで構成されたファクトリごと)および 1つファクトリごとの接続の使用を維持することをお勧めします。

サーバーは、インプレースの「接続」フェイルオーバーと再接続を担当するように表示されますので、その機能を実行していることを確認してから、その機能に頼りましょう。

クライアント側のソリューションの作成は、サーバーまたはクライアントのセットアップの問題を修正するよりも少し複雑になります。失敗した接続から作成したすべてのセッションを再作成する必要があります(プロデューサー、コンシューマー、および宛先は言うまでもありません)。 「再接続」はありません。または「更新」いずれかのタイプのメソッド。セッションは、親接続への参照も保持しません。

接続/セッションオブジェクトのルックアップを管理し、全員を再初期化する必要があります!または、新しい接続を取得して再接続できるセッション障害イベントハンドラーを実装します。

それでは、今のところ、クライアントがフェイルオーバー通知を受信するように設定されているかどうかを調べてみましょう(tib ems users guide pg 292)。そして、発生した例外がキャッチされ、フェイルオーバーURLが含まれ、適切に処理されていることを確認してください。

他のヒント

まず、はい、私は自分の質問に答えています。ただし、アジュマストリアンがなければ私はどこにもいないことに注意することが重要です。ありがとうございます!

ONE: ConnectionFactory.SetReconnAttemptCount、SetReconnAttemptDelay、SetReconnAttemptTimeoutは適切に設定する必要があります。デフォルト値の再試行が速すぎると思います(再試行の間隔は約1/2秒)。 EMSサーバーは、ネットワークストレージなどのためにフェールオーバーに長い時間がかかる可能性があります。そのため、1/2秒間隔で5回再試行しても、十分な長さではありません。

2: クライアントサーバーとサーバークライアントのハートビートを有効にすることが重要だと思います。検証できませんでしたが、それらが適切に配置されていないと、クライアントはサーバーがオフラインまたはフェールオーバーモードに切り替わっているという通知を受け取らないことがありました。もちろん、これはEMSのサーバー側の設定です。

3: 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());
}

tibco.tibjms.ft.switch.exceptionシステムプロパティを設定することにより、クライアントアプリケーションがフェイルオーバーの通知を受け取ることがあります

おそらく、ライブラリが動作するために必要ですか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top