2012-04-19 6 views
0

私はGlassfish 3.1.1と、着信XMPPパケットを処理するためにsmackライブラリと組み合わせたEJB 3.1アーキテクチャを使用しています。各送信者のメッセージキュー

これは私のスレッドは、受信パケットを処理するシングルトンから開始しています。私は必要なもの

Packet packet = collector.nextResult(); 
if (packet != null) 
    processPacket(packet); // here i lookup my processing EJB and start working 

は時間で、送信者ごとにプロセスつのパケットにパケットを並ぶキューです。現時点では、すべての受信パケットを並行して処理するため、パケットの順序を保持することができません。

どのように私はこれを可能な限りエレガントに解決することができますか?

挨拶は

PS m個:最初のアプローチは、現時点でパケットを処理し、私が収集したパケットを反復処理すると、何も処理していない送信者を探しされているクライアント格納することです。しかし、バッファ内のパケットのどれもが処理されることが許されない場合、これは多くの反復を要することになると思います。

答えて

0

事前に送信者がわかっている場合は、各送信者に一致するPacketFilterを登録できます。したがって、各コレクタは各送信者からのパケットをキューに入れます。

わからない場合は、同じことを達成できますが、自分でメッセージをルーティングする必要があります。コレクタの代わりにPacketListenerを使用し、各メッセージを受信時に送信キューにルーティングします。キューがまだ存在しない場合は、オンデマンドでキューを作成できます。

+0

以前はPacketListenerを試しましたが、パケットの処理を停止したいときにはより多くの制御ができるので、私はPacketCollectorを優先します。ヘイバーロードの下では、パケットリスナーは、キャンセルしてもバッファーが空になるまでコールバック関数を呼び出し続けます。コレクタでは、キューイングされたパケットの数(リフレクション)を取得して、そのヘルスステータスを判別することで監視することもできます。とにかく。私が新しいパッケージを受け取るとき、私はクライアントごとに効率的なキューイングを必要とします。あなたはそれについて何か考えていますか?私はPSに私の最初のアプローチを投稿します。 – mkuff

関連する問題