2

Webソケットを介してJMSバックエンドと対話するために.NETKaazingクライアントを利用しようとしています。セッションの正しい使い方を理解するのに苦労しています。最初は、すべてのスレッドで1つのセッションを共有していましたが、これがサポートされていないことに気付きました。

Sessionオブジェクトは、メッセージを生成および消費するためのシングルスレッドコンテキストです。Java仮想マシン(JVM)の外部にプロバイダーリソースを割り当てる場合がありますが、軽量のJMSオブジェクトと見なされます。

私が1回のセッションを行った理由は、それによってパフォーマンスが向上すると思ったからです。ドキュメントにはセッションが軽量であると記載されていたため、「操作」ごとにセッションを使用するようにコードを切り替えることを躊躇しませんでした。「操作」とは、単一のメッセージを送信するか、キュー/トピックにサブスクライブすることを意味します。前者の場合、セッションは短命であり、メッセージが送信された直後に閉じられます。後者の場合、サブスクリプションがアクティブである限り、セッションは存続する必要があります。

複数のセッションを作成しようとすると、エラーが発生しました。

System.NotSupportedException: Only one non-transacted session can be active at a time

このエラーをグーグルで検索しても効果がなかったので、トランザクションセッションに切り替えてみました。しかし、コンシューマーを作成しようとすると、別のエラーが発生します。

System.NotSupportedException: This operation is not supported in transacted sessions

だから私は岩と固い場所の間に立ち往生しているようです。私が見る唯一の可能なオプションは、スレッド間でセッションを共有するか、コンシューマーの作成に使用される単一の非トランザクションセッションと、その他すべての複数のトランザクションセッションを使用することです。これらのアプローチはどちらも、私には少し反しているように見えます。

誰かが私のクライアントでセッションを処理するための正しい方法に光を当てることができますか?

4

1 に答える 1

0

アプリケーションに並行性を追加するには、いくつかの方法があります。複数の接続を使用することもできますが、ネットワーク オーバーヘッドが増加するため、おそらく望ましくありません。タスクをディスパッチするか、ConcurrentQueues を介してメッセージを配信することにより、メッセージ リスナーで同時実行を処理するための単純なメカニズムを実装することをお勧めします。実装戦略のいくつかの選択肢を次に示します。

  1. タスク ベースのアプローチでは、TaskScheduler を使用します。MessageListener では、作業を処理してすぐに戻るようにタスクがスケジュールされます。たとえば、メッセージごとに新しいタスクをスケジュールできます。この時点で MessageListener が返され、次のメッセージがすぐに利用可能になります。このアプローチは、スループットの低いアプリケーション (1 秒あたり数メッセージなど) には適していますが、一部のメッセージの処理に時間がかかる可能性があるため、同時実行が必要な場合に適しています。

  2. 別のアプローチは、保留中の作業 ( ConcurrentQueue ) のメッセージのデータ構造を使用することです。MessageListener が呼び出されると、各メッセージが ConcurrentQueue に追加され、すぐに返されます。次に、スレッド/タスクの別のセットが、アプリケーションに適した戦略を使用して、その ConcurrectQueue からメッセージをプルできます。これは、より高性能なアプリケーションで機能します。

  3. このアプローチのバリエーションは、受信メッセージを処理するスレッドごとに ConcurrentQueue を持つことです。ここで、MessageListener は独自の ConcurrentQueue を管理しませんが、代わりに、各スレッドに関連付けられた ConcurrentQueue にメッセージを配信します。たとえば、株式フィードとニュース フィードを表すインバウンド メッセージがある場合、1 つのスレッド (またはスレッドのセット) が株式フィード メッセージを処理し、別のスレッドがインバウンド ニュース項目を個別に処理できます。

JMS キューを使用している場合、MessageListener が返されると、各メッセージが暗黙的に確認されることに注意してください。これは、アプリケーションに必要な動作である場合とそうでない場合があります。

より高性能なアプリケーションの場合は、アプローチ 2 と 3 を検討する必要があります。

于 2012-06-12T15:27:19.313 に答える