JSP Rabbitmq:如何使用下一条消息

时间:2012-10-18 11:02:51

标签: jsp servlets rabbitmq

当我到达“QueueingConsumer.Delivery delivery = consumer.nextDelivery()”时,在JSP中

页面被加载。消息被消耗但jsp不会加载也不会出错。请帮忙

String QUEUE_NAME = "hello";

ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();

channel.queueDeclare(QUEUE_NAME, false, false, false, null);
out.println(" [*] Waiting for messages. To exit press CTRL+C");

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

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

1 个答案:

答案 0 :(得分:1)

我猜你正在尝试在JSP页面中实现RabbitMQ "Hello World" tutorial。 你不能这样做:

  • QueueingConsumer.nextDelivery将阻止,直到队列中有消息
  • 要显示所有消息,当它们到达队列的头部时,您需要一个无限循环(如教程中所示),这在JSP页面中不起作用。

您的JSP页面是请求生命周期的一部分,需要尽快结束并将请求的资源(在本例中是JSP页面中的HTML等)返回给用户的浏览器。虽然大多数浏览器会在收到结果时开始显示结果,但它们不会处理长时间的中断或永无止境的响应。即使他们可能你不希望这样,因为服务器可以处理的并发请求数量会受到限制。

如果您正在使用RabbitMQ来查看​​它是如何工作的,那么我建议您开发一个Java应用程序(根据教程),即不要尝试在webapp中进行。 (另外,正如fvu所指出的,请注意QueueingConsumer现已弃用)。

如果您需要在webapp中执行此操作,那么您将需要考虑一种存储消息的方法(例如,如果您有一个例如Tomcat的实例,则可以在数据库或单例数据结构中)消息队列(可能是后台线程,即不是服务请求的线程)。然后,您的JSP页面可以从您的数据结构中读取消息以显示给用户。

相关问题