【问题标题】:Does ActiveMQ QueueBrowser load entire contents of queue into memory?ActiveMQ QueueBrowser 是否将队列的全部内容加载到内存中?
【发布时间】:2020-03-06 02:34:37
【问题描述】:

当我们使用javax.jms.QueueBrowser.getEnumeration() 时,它只会浏览JVM 内部的队列内容吗?它会显着影响应用程序的内存使用吗?

此外,当我们使用队列浏览器获取队列本身时,实际上会占用大量数据,而getEnumeration() 不会出现这种情况。请帮助我理解我是否正确。

【问题讨论】:

  • “JVM 内部的队列内容”是什么意思?
  • 当您提到“应用程序内存使用”时,您指的是执行 QueueBrowser 的应用程序还是 ActiveMQ 代理本身?
  • “当我们使用队列浏览器获取队列本身时”究竟是什么意思?
  • 是的,我的意思是应用程序执行队列浏览器
  • 来自 docs :: 客户端使用 QueueBrowser 对象查看队列中的消息而不删除它们。 getEnumeration 方法返回一个用于扫描队列消息的 java.util.Enumeration。它可能是队列全部内容的枚举,也可能只包含与消息选择器匹配的消息。这是否意味着当我们执行 getEnumeration 时队列内容没有加载到应用程序内存中?

标签: jms activemq


【解决方案1】:

当您使用带有QueueBrowser 的队列时,会预取一定数量的消息。可以在ActiveMQPrefetchPolicy on an ActiveMQConnectionFactory 中配置此限制。属性queueBrowserPrefetch 控制批量接收的消息数量,并缓冲到内存中,直到所有消息都被确认。

【讨论】:

  • 嗨 Anton,如果我使用浏览器预取,你能告诉我如何确认吗?这只是正常的方式吗 - 就像我们使用客户端确认生成队列一样,现在如果我使用预取 10 的浏览器访问消息,那么在枚举中的每条消息之后,我只需要执行 message.acknowlede 吗?没有这方面的示例.. 感谢您的帮助!
  • 来自 docs :: 客户端使用 QueueBrowser 对象查看队列中的消息而不删除它们。 getEnumeration 方法返回用于扫描队列消息的 java.util.Enumeration。它可能是队列全部内容的枚举,也可能只包含与消息选择器匹配的消息。这是否意味着当我们执行 getEnumeration 时队列内容没有加载到应用程序内存中?
  • createSession 方法中的 JMS 会话上设置了确认模式。有3 acknowledge modes。当使用AUTO_ACKNOWLEDGE(在大多数情况下几乎是默认选项)时,您无需在代码中手动确认消息。
  • 消息最初在 QueueBrowser 创建时发送。如果您关心内存消耗,您可以设置较低的预取值(1 到 10)。
  • 感谢 Anton,能否将此信息添加到与队列浏览器相关的 ActiveMQ 文档中?
猜你喜欢
  • 2012-11-17
  • 2021-04-14
  • 2021-11-26
  • 2015-03-10
  • 2019-05-27
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
  • 2012-05-13
相关资源
最近更新 更多