JMS主题生存时间

Ste*_*nia 6 java tomcat activemq-classic jms web

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

我希望如果没有消费者,消息将在300000毫秒内到期,并且它们将被解除分配.

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

在主题设置下的MBeans选项卡中使用Java VisualVM监视ActiveMQ我看到变量"Enqueue Count"增长,但我不明白生存时间设置是否对这些消息生效.我希望看到计数器"ExpiredCount"增加,但它仍然固定为0.

有没有办法了解这些消息是否仍然留在内存中或者是否已取消分配?

非常感谢你!

编辑:

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

JMS API不提供浏览主题的机制.消息一出现就会从主题中消失:如果没有消息消费者使用它们,则JMS提供程序会删除它们.虽然持久订阅允许消息保留在主题上,但消息使用者不活动时,不存在检查它们的工具.

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

结束编辑.

Ber*_*ium 5

引用创建健壮的JMS应用程序

5.1.4允许消息过期
[...]
当消息被发布,指定的传输TimeToLive被添加到当前的时间,得到的期满时间。在指定的到期时间之前未传递的任何邮件都将被销毁。

来自以下来源的另一句话javax.jms.Message#getJMSExpiration()

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

因此,对于非长期订阅者:

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

因此,在您的情况下,如果没有使用者,则消息可能根本不会存储。 入队计数增加,并且过期计数保持为0。仅在已连接(但处于空闲)订户的情况下,过期计数才应增加。

我如何找到队列大小的报价

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

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