1

http://svn.apache.org/repos/asf/activemq/trunk/assembly/src/release/example/src/StompExample.javaにある例のバリエーションを使用して、キューからメッセージを受信して​​います。私がやろうとしているのは、キューをリッスンし続け、新しいメッセージを受信したときに何らかのアクションを実行することです。問題は、関連するオブジェクトにリスナーを登録する方法が見つからなかったことです。私は次のようなことを試しました:

public static void main(String args[]) throws Exception {
    StompConnection connection = null;
    try {
        connection = new StompConnection();
        connection.open("localhost", 61613);
        connection.connect("admin", "activemq");
        connection.subscribe("/queue/worker", Subscribe.AckModeValues.AUTO);
        while (true) {
            StompFrame message = connection.receive();
            System.out.println(message.getBody());
        }
    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (connection != null) {
            connection.disconnect();
        }
    }
}

ただし、数秒後にタイムアウトが発生するため、これは機能しません(java.net.SocketTimeoutException: Read timed out)。このキューを無期限に聞くために私にできることはありますか?

4

3 に答える 3

1

ActiveMQ の StompConnection クラスは、比較的原始的な STOMP クライアントです。Message での非同期コールバックや無期限の待機はできません。タイムアウトを渡して受信することはできますが、STOMP v1.1 を使用しているかどうかによっては、ハートビートが時間内に受信されない場合でも早期にタイムアウトする可能性があります。もちろん、いつでもタイムアウト例外をキャッチして再試行できます。

Java 経由の STOMP の場合は、実際の JMS クライアントのように動作し、非同期メッセージ受信を可能にする StompJMSなどを使用することをお勧めします。

于 2012-10-07T11:01:29.627 に答える
0

@Tim Bish:StompJMSを試しましたが、使用できる例が見つかりませんでした(リンクを提供できるかもしれません)。タイムアウトをブロックしているように見える0に設定することで、問題を「修正」しました。

于 2012-10-08T01:47:21.633 に答える