3

Hermes や GEMS などの API を使用せずにキューを監視しようとしています。つまり、純粋に Java を使用したいと考えています。キューを参照するため、つまり、メッセージがキューに到達したかどうかを実際に消費せずにチェックします。以下のコードを記述しました。

javax.jms.QueueBrowser browser = session.createBrowser(queue);

        Enumeration msgs = browser.getEnumeration();

        int Count=0;

        while(msgs.hasMoreElements())
        {
            message = (javax.jms.Message)msgs.nextElement();
            System.out.println("Message"+message);
            Count++;
        }

ただし、メッセージをキューに発行すると、結果が表示されません。メッセージがキューに到達し、受信者によって消費されていることを確認しました。したがって、このアプローチが機能しなかったため、前後にキューによって受信された numberOfMessages をカウントするという別のアプローチを使用することを考えました。だから私は以下のコードを使用しました

QueueInfo q= new QueueInfo(queueName);
    long l=q.getInTransitMessageCount();
    System.out.println("In transit Mesasge Count="+l+"\n");

しかし、これも機能していません。この問題を解決するための提案や説明をいただければ幸いです。コードにコンパイル エラーがなく、必要なすべてのクラスがインポートされていることに注意してください。

4

3 に答える 3

1

使用しているコードは、ある時点でのキュー内のメッセージ数をカウントします。このタイムスライス外でポストされて消費されたメッセージは表示されず、メッセージはほとんどの JMS 実装で非常に迅速に消費されます。

アクティブなメッセージ キューを監視するときは、キューにメッセージがあるかどうかのみを考慮します。これは、コンシューマーが停止したか、十分な速度で消費していないことを意味するためです。

通過するメッセージをカウントしようとしている場合は、メッセージをインターセプトする必要があります (つまり、メッセージを自分で消費して別のキューに投稿します)。

あなたが本当に欲しいものについて、より多くの情報を提供したいと思うかもしれません。

于 2012-01-08T23:57:31.417 に答える
0

ブラウザのコードが正しいようです。正しいキュー引数を渡しているかどうかを確認してください。または、デバッグして、そのループが実行されない理由を確認してください。

于 2012-01-05T17:39:57.857 に答える
0

QueueBrowser はスナップショットを提供する必要はありません。キューに他のコンシューマーがいる場合、それらはそれを排出するため、それらが引き離されている可能性があります。最初にコンシューマーをオフにして、何が起こるかを確認してください。[1] を参照

[1] http://docs.oracle.com/javaee/1.3/api/javax/jms/QueueBrowser.html

于 2012-01-06T10:52:09.503 に答える