JMS主题生存时间

时间:2013-08-29 09:49:45

标签: java tomcat web jms activemq

我正在开发一个由一些模块组成的应用程序。在其中一个模块中,有人创建了一个主题生成器,用于发布关于主题的消息,但是该模块没有主题消费者来使消息出列。主题生产者使用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服务器也是有效的。

结束编辑。

1 个答案:

答案 0 :(得分:4)

来自Creating Robust JMS Applications的引用:

  

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

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

  

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

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

  1. 服务器将消息发送给每个连接的订户。消息中的到期值设置为“当前时间+ TTL”。断开连接的订户将不会收到任何内容。
  2. 如果已连接的客户端尚未过期,则会正常收到该消息。
  3. 如果连接的客户端在收到消息之前花费的时间太长(消息已过期),则服务器可能会丢弃它(可能是服务器尚未将其推入客户端的缓冲区)或者可以接收(可能是因为消息已经在客户端的缓冲区中。)
  4. 因此,在您的情况下,如果没有消费者,则可能根本不存储该消息。 排队计数增加,过期计数保持为0. 过期计数只应在连接(但空闲)用户的情况下增加。< / p>

    来自How do I find the Size of a Queue

    的引用
      

    入队计数 - 自上次重启以来发送到队列的消息总数
      已过期计数 - 因过期而未送达的邮件数

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