1

交換でメッセージを送受信するプログラムがあります。プログラムのメッセージがキューにあるかどうかに関係なく、プログラムは実行を継続する必要があります。ほとんどすべてのチュートリアルには、ブロッキングの例があります。

while (true) {
     QueueingConsumer.Delivery delivery = consumer.nextDelivery();
     System.out.println("Message: " + new String(delivery.getBody()));
     ch.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
}

非同期バージョンであると理解しているものに出くわしました。つまり、メッセージがキューで使用可能になると、handleDelivery関数が呼び出されます(コールバック)。

 boolean autoAck = false;
 channel.basicConsume(queueName, autoAck, "myConsumerTag",
 new DefaultConsumer(channel) {
     @Override
     public void handleDelivery(String consumerTag,
                                Envelope envelope,
                                AMQP.BasicProperties properties,
                                byte[] body)
         throws IOException
     {
         String routingKey = envelope.getRoutingKey();
         String contentType = properties.contentType;
         long deliveryTag = envelope.getDeliveryTag();
         // (process the message components here ...)
         channel.basicAck(deliveryTag, false);
     }
 });

ドキュメントを読んだ後でも、上記のコードスニペットが実際に非同期であるかどうかはわかりません。また、送信された実際のメッセージを取得する方法がわかりません。助けてください。

4

1 に答える 1

1

2番目のコードスニペットを試さなくても、必要なことを実行できる可能性があると言えます。ただし、おそらくこれを実行しますが、内部でスレッドを使用します(新しいメッセージを待機している間はブロックされます)。私がやっていることは、whileループを新しいスレッドに固定して、そのスレッドだけがブロックされ、プログラムの残りの部分が非同期的に続行されるようにすることです。

于 2013-01-29T12:18:16.100 に答える