【问题标题】:JSP Rabbitmq: how to consume next messageJSP Rabbitmq:如何消费下一条消息
【发布时间】:2012-10-08 19:42:05
【问题描述】:

在 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 + "'");
}

【问题讨论】:

  • 我看不出那个while循环的出路?
  • 正如 fvu 所指出的,请求的处理会卡在你的 while 循环中
  • 即使没有 while 循环,页面仍然卡在 QueueingConsumer.Delivery delivery = consumer.nextDelivery();
  • 那将是因为没有消息 - nextDelivery() 阻塞直到有
  • 谢谢马丁。我在将消息发送到队列后尝试加载页面,但页面仍然无法加载。那么我该如何在页面上显示消息呢?

标签: jsp servlets rabbitmq


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 2016-11-13
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多