我正在开发一个由一些模块组成的应用程序。在其中一个模块中,有人创建了一个主题生成器,用于发布关于主题的消息,但是该模块没有主题消费者来使消息出列。主题生产者使用setTimeToLive()
将生存时间属性设置为300000毫秒。
我希望如果没有消费者,消息将在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不提供浏览主题的机制。消息通常从a消失 主题一出现:如果没有消息消费者使用它们,那么JMS 提供者删除它们。虽然持久订阅允许消息保留在主题上>当消息使用者不活动时,不存在检查它们的工具。
我读到glassfish在activeMQ中使用,所以我希望这对于独立的ActiveMQ服务器也是有效的。
结束编辑。
答案 0 :(得分:4)
来自Creating Robust JMS Applications的引用:
5.1.4允许邮件过期
[...]
当消息发布时,指定的 timeToLive 会添加到当前时间,以提供到期时间。在指定的到期时间之前未传递的任何消息都将被销毁。
javax.jms.Message#getJMSExpiration()
来源的另一个引用:
当邮件的到期时间到来时,提供商应丢弃。 [...]
客户端不应接收已过期的邮件;但是,JMS API 不保证不会发生这种情况。
所以在非持久订阅者的情况下:
因此,在您的情况下,如果没有消费者,则可能根本不存储该消息。 排队计数增加,过期计数保持为0. 过期计数只应在连接(但空闲)用户的情况下增加。< / p>
来自How do I find the Size of a Queue
的引用入队计数 - 自上次重启以来发送到队列的消息总数
已过期计数 - 因过期而未送达的邮件数
注意:使用JBoss 7的测试显示,在这种情况下,消息不会在客户端中出现。