如何在Web应用程序中的RabbitMQ上使用while(true)

时间:2013-12-20 22:55:42

标签: java servlets rabbitmq

在使用RabbitMQ的Java的this示例中,我在接收器上看到您有以下代码:

  QueueingConsumer consumer = new QueueingConsumer(channel);
channel.basicConsume(QUEUE_NAME, true, consumer);

while (true) {
  QueueingConsumer.Delivery delivery = consumer.nextDelivery();
  String message = new String(delivery.getBody());
  System.out.println(" [x] Received '" + message + "'");
}

我不认为在servlet中使用一段时间(真实)可能是一个好主意,所以我想知道我是否应该使用Servlet With Thread或其他替代方法。

3 个答案:

答案 0 :(得分:0)

您可以使用命令解析器。

boolean enough = false;
while (!enough) {
  QueueingConsumer.Delivery delivery = consumer.nextDelivery();
  String message = new String(delivery.getBody());
  System.out.println(" [x] Received '" + message + "'");
  if (message.toLowerCase().equals("exit")) enough = true;
}

答案 1 :(得分:0)

在servlet中使用while (true) { ... }没有任何害处,因为这个例子很简单。 所有它等待下一条消息,然后打印出来。

在更复杂的应用程序中,通常有一个专门用于读取消息的线程和一个用于处理消息的线程池。

while (true) {
    QueueingConsumer.Delivery delivery = consumer.nextDelivery();
    String message = new String(delivery.getBody());
    process(message); // performs the processing in another thread
}

使用另一个线程进行处理的原因是为了避免在处理消息时填充消息缓冲区。 如果只有1个线程用于从队列和处理中读取,则在处理完成之前不会读取新消息。 这可能导致队列缓冲区溢出。

答案 2 :(得分:0)

你不应该将消息作为web服务器的一部分使用,而应该使用另一个进程,一个worker守护进程使用rabbitmq消息,spring有一个很好的模块,如果正确写入,请参阅http://docs.spring.io/spring-amqp/reference/html/amqp.html它也可以管理一个线程池并完全独立