2016-06-15 2 views
0

を待ちませんしています。代わりに、すぐに停止します。次のように私はそれはいくつかの時間を消費することができます 唯一の方法は、ループでchannel.basicConsumeを置き換えることです:どのように私は、次のコードを起動するたびに、私のchannel.basicConsumeメッセージ

DateTime startedAt = new DateTime(); 
    DateTime stopAt = startedAt.plusSeconds(60); 
    long i=0; 
    try { 
     while (stopAt.compareTo(new DateTime()) > 0) { 
      channel.basicConsume(queueName, true, consumer); 
      i++; 
     } 
    }finally { 
     System.out.println(new DateTime()); 
     System.out.println(startedAt); 
     System.out.println(stopAt); 
     System.out.println(i); 
    } 

正しい、しばらくの間、メッセージを聞くためのより良い方法があるに違いありませんか?私は何が欠けていますか? すぐにリスニングを停止します。

+0

ConnectException:Connection refusedなどの例外はありませんか? –

答えて

3

本当に停止していますか? basicConsumeは、特定のキューをリスンするコンシューマを登録して、ループ内で実行する必要はありません。一度だけ実行すると、メッセージが到着するたびに、ConsumerのインスタンスのhandleDeliveryメソッドが呼び出されます。

rabbitmqライブラリが作成するスレッドは、JVMが終了しないようにする必要があります。プログラムを終了するためには、実際にここでconnection.close()

を呼び出す必要がRabbitMQのからの完全な受信機の例である:https://github.com/rabbitmq/rabbitmq-tutorials/blob/master/java/Recv.java

それは実際にはかなり多くのあなたと同じです。

0

私は同じ問題がありました。理由は、私は最後にconnection.closeを呼び出していたということでした。ただし、basicConsume()メソッドは現在のスレッドではなく他のスレッドでブロックされるため、その後のコード、つまりconnection.close()が直ちに呼び出されます。

関連する問題