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

如果不尝试第二个代码片段,我可以说它有可能做你想要的。然而,它可能会这样做,但在内部使用一个线程(在等待新消息时将被阻塞)。我所做的是将while循环粘贴在一个新线程中,这样只有那个线程被阻塞,你的程序的其余部分继续异步

于 2013-01-29T12:18:16.100 回答