2

在 JSP 中,当我到达“QueueingConsumer.Delivery Delivery = consumer.nextDelivery()”时,页面被卡住了加载。消息已被使用,但 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 + "'");
}
4

1 回答 1

1

我猜您正在尝试在 JSP 页面中实现RabbitMQ“Hello World”教程。你不能这样做:

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

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

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

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

于 2012-10-18T11:36:28.870 回答