Java 生命的时刻

Java 生命的时刻,java,tomcat,web,jms,activemq,Java,Tomcat,Web,Jms,Activemq,我正在开发一个由一些模块组成的应用程序。在其中一个模块中,有人创建了一个主题生产者来发布关于主题的消息,但是这个模块没有主题消费者来对消息进行排队。主题制作人使用setTimeToLive()将生存时间属性设置为300000毫秒 我预计,如果没有消费者,消息将在300000毫秒内过期,并被释放 该应用程序部署在Tomcat 6.0.36上,它使用外部ActiveMQ服务器来处理队列和主题 在主题设置下的MBeans选项卡中使用Java VisualVM监视ActiveMQ我看到变量“Enqueu

我正在开发一个由一些模块组成的应用程序。在其中一个模块中,有人创建了一个主题生产者来发布关于主题的消息,但是这个模块没有主题消费者来对消息进行排队。主题制作人使用
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不提供浏览主题的机制。消息通常会从文件中消失 主题:如果没有消息使用者使用它们,JMS 提供者将删除它们。尽管持久订阅允许邮件在邮件使用者未处于活动状态时保留在主题>,但不存在检查邮件的工具

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

结束编辑。引用自:

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

另一段引用自
javax.jms.Message#getJMSExpiration()
的源代码:

当消息过期时,提供者应放弃它。 […]
客户端不应接收已过期的邮件;然而,jmsapi并不保证这不会发生

因此,对于非持久订户:

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

    引自

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


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

    主题是否持久?在哪里/如何查看此设置?您使用的是
    topicSession.createSubscriber(…)
    还是
    topicSession.createDurableSubscriber(…)
    ?使用以下指令创建生产者:producer=jmsTopicSession.createProducer(主题);。未使用创建订阅服务器。这是错的吗?或者它会给我们带来一些问题吗?我想你应该读一下:你知道我可以用什么方法来验证消息是否真的没有被存储吗?你可以设置一个测试程序,它会不断发送关于某个主题的大量消息(没有任何消费者)。查看计数器和堆大小。这还不是"对",;否则你必须查看代码。我收到过期的消息。有人能帮忙吗?