質問
EMSコードへの接続性は、当初、聞いたトピックごとに1つのトピック接続オブジェクトを作成していませんでした。したがって、実際には、トピックを購読するたびに、新しい接続、新しいセッション、そして最後に新しいリスナーを作成します。
単一の接続モデルに切り替えたいと思います。 1つの接続オブジェクトを共有し、トピックごとに新しいセッションオブジェクトを作成することでコードで簡単に実行できますが、これがコードなしで問題を引き起こすかどうかはわかりません。
私の理解では、TIBCO EMSクライアントライブラリは、接続の共有に関して安全であるということです。実際には、接続は単なるパイプであり、セッションはこのパイプを安全な方法で再利用できます。
この仮定は正しいですか、それともこれにもっとありますか?
解決
.NET EMS APIはに基づいています JMS. 。 JMSでは、接続オブジェクトとセッションオブジェクトはスレッドセーフとして指定されており、プログラム内で再利用できます。接続オブジェクトは、EMSサーバーのネットワークパイプを単に表すという点で非常に正しいです。 EMSユーザーガイドは次のように述べています。
接続はかなりヘビー級オブジェクトであるため、ほとんどのクライアントは接続を1回作成し、クライアントが終了するまで開いたままにします。必要に応じて、アプリケーションが複数の接続を作成できます。
セッションに関して:
セッションは、メッセージを作成または消費するための単一の読み取りコンテキストです。セッションオブジェクトを使用してメッセージプロデューサーまたはメッセージ消費者を作成します。
基本的に、非常に大量のボリュームが必要で、パフォーマンスの制限にぶつかっていない限り、アプリケーションで1つの接続を使用することは完全に安全です。セッションは、内部で作成された生産者または消費者の取引/謝辞セマンティクスを制御しますが、再利用するのは安全です。おそらく、個別のライフサイクルを使用して、アプリケーション内にモジュールに個別のセッションを使用します(アプリケーションサーバー内の個別の展開ユニットを検討してください)。
EMSサーバーのインストールには、さまざまなコードを持つサンプルディレクトリが含まれます( c: tibco ems 5.0 samples cs)。コード ctopicsubscriber.cs シングルスレッドトピック消費者の書き方を示します。マルチスレッドトピックの消費者の例はありませんが CSMSGCONSUMERPERF.CS キューでそれを行う方法を示します。
完了した後に作成したオブジェクトをクリーンアップしてください - トピックコンシューマオブジェクト、セッション、および終了時の接続を閉じてください。閉じることなくハンドルを漏らすと、プリフェッチとフォールトトレラントの再接続設定と組み合わせると、予測不可能な動作が発生する可能性があります。
他のヒント
共有が同じアプリケーション内にある限り、はい(EXE、バイナリ)と思います。同じ接続オブジェクトを共有し、コードでシングルトンとして使用しました。
以前の回答に同意します:JMSセッションはスレッド間で共有されるべきではありませんが、接続はできるはずです。したがって、アプリケーションごとに1つの接続がOKです(個々のスレッドの作成の前後に最適な1回だけ開始/閉じることを確認してください)。
次に、スレッドごとに1つのセッションを作成して使用します。セッションを閉じると()セッションを閉じると、すべてのコールバックが実際に戻ってくるまでブロックされることを忘れないでください。したがって、コールバックのonmessage()内からclose()を呼び出さないでください。