【问题标题】:JMS topic time to liveJMS 主题生存时间
【发布时间】:2013-09-01 16:32:22
【问题描述】:

我正在开发一个由一些模块组成的应用程序。在其中一个模块中,有人创建了一个主题生产者,该主题生产者在主题上发布消息,但该模块没有主题消费者来使消息出列。主题生产者使用setTimeToLive() 将生存时间属性设置为 300000 毫秒。

我希望如果没有消费者,消息会在 300000 毫秒内过期并被释放。

该应用程序部署在 Tomcat 6.0.36 上,它使用外部 ActiveMQ 服务器来处理队列和主题。

Monitoring ActiveMQ with Java VisualVM in the MBeans tab in the MBeans tab in the topic settings 我看到变量“Enqueue Count”增加了,但我不明白生存时间设置是否对这些消息生效。我预计会看到计数器“ExpiredCount”增加,但它仍然固定为 0。

有没有办法了解这些消息是否仍保留在内存中或是否已被释放?

非常感谢!

编辑:

我在 netbeans 7.3 上使用 j2ee 教程示例进行了一些测试,使用内部 glassfish 3.1 作为服务器,使用 jvisualvm 监控它,所有工作都按照 api 所说:

JMS API 不提供浏览主题的机制。消息通常会从 主题一出现:如果没有消息消费者消费它们,JMS 提供者删除它们。尽管持久订阅允许消息在消息消费者不活动时保留在主题上,但不存在检查它们的工具。

我读到 glassfish 在 activeMQ 中使用,所以我希望这对独立的 ActiveMQ 服务器也有效。

结束编辑。

【问题讨论】:

  • 主题持久吗?
  • 在哪里/如何查看此设置?
  • 你使用的是topicSession.createSubscriber(...)还是topicSession.createDurableSubscriber(...)
  • 使用以下指令创建生产者:producer = jmsTopicSession.createProducer(topic);。不使用创建订阅者。这是错的吗?或者它会给我们带来一些问题?
  • 我认为您应该阅读以下内容:activemq.2283324.n4.nabble.com/…

标签: java tomcat web jms activemq


【解决方案1】:

引用Creating Robust JMS Applications:

5.1.4 允许消息过期
[...]
当消息发布时,指定的timeToLive被添加到当前时间以给出过期时间。在指定的过期时间之前未传递的任何消息都将被销毁。

另外引用javax.jms.Message#getJMSExpiration()的来源:

当消息达到过期时间时,提供者应该丢弃它。 [...]
客户不应收到已过期的消息;但是,JMS API不保证这不会发生。

所以在非持久订阅者的情况下:

  1. 服务器将消息发送给每个连接的订阅者。消息中的过期值设置为“当前时间 + TTL”。断开连接的订阅者将不会收到任何信息。
  2. 如果消息尚未过期,已连接的客户端正常接收消息。
  3. 如果连接的客户端在接收消息之前花费了太长时间(消息已过期),它可能会被服务器丢弃(可能在服务器尚未将其推送到客户端缓冲区的情况下)或者可以接收(如果消息已经在客户端的缓冲区中)。

因此,在您的情况下,如果没有消费者,则消息可能根本不会存储。 Enqueue count 增加,Expired Count 保持为 0。Expired count 仅应在订阅者连接(但空闲)的情况下增加。

来自How do I find the Size of a Queue的引用

Enqueue Count - 自上次重启以来发送到队列的消息总数
Expired Count - 由于过期而未传递的消息数

注意:使用 JBoss 7 的测试表明,在这种情况下,消息不会出现在客户端中。

【讨论】:

  • 你知道一种方法可以验证消息是否真的没有存储吗?
  • 您可以设置一个测试程序,该程序会持续发送关于某个主题的大量消息(没有任何消费者)。查看计数器和堆大小。这仍然不是“正确的”;否则你必须查看代码。
  • 我收到了过期的消息。任何身体都可以帮忙吗?
猜你喜欢
  • 2017-03-14
  • 1970-01-01
  • 2016-02-03
  • 2013-04-01
  • 2012-12-15
  • 2011-07-31
  • 2016-01-29
  • 2018-11-09
  • 2011-03-31
相关资源
最近更新 更多