1

我放弃了 JBoss 社区论坛 - 从来没有在那里得到答案。所以在这里尝试。

我编写了一个小测试程序来帮助我诊断我在实际环境中看到的问题,但是我对 JBoss MQ 的无数可配置设置感到有点困惑,而且对它们都没有做出任何设置的事实更加困惑区别。

环境是JBoss 4.0.,4。

在实时环境中,从独立 Java 应用程序到远程机器上的 JBoss MQ 主题(由 MDB 提供服务)的 JMS 连接正在丢失。我没有任何关于它为什么丢失的信息(以及异常监听器启动)。

因此,我使用 Java 应用程序创建了一个测试环境,该应用程序将 TextMessages(包含递增的数字)发送到远程 JBoss 上的主题。

MDB 代码所做的只是在 TextMessage 中打印数字。

我注意到的第一件事是打印的线程称为“JMS SessionPool Worker-XX”,其中 XX 是 0 到 32。当我再次运行发送方应用程序时,XX 的值是 32 到 46。第三个run,值为 46 到 60。模式始终相同 - 在 JBoss 启动后第一次运行使用更多线程,后续运行使用 14 或 15 个线程。

那么,问题 1:对这种模式有解释吗?

在发送大约 15,000 条消息的运行期间,jms_messages 表在 JBoss 机器上建立。这意味着 JBoss MQ 跟不上,对吧?我假设内存必须高于 mysql-jdbc2-service.xml 中 MessageCache MBean 定义中指定的阈值。但是当我监控 JVM 内存时,它与为 HighMemoryMark 指定的 150MB 值相去甚远。我想我误解了有关 MessadeCache bean 定义的这条评论:“一旦 JVM 内存使用量达到高内存标记,缓存中的旧消息将开始存储在 DataDirectory 中”。我认为这意味着当堆使用量达到 150MB 时,收到的消息将开始写入 jms_messages,但显然我错了。

问题二:JBoss MQ 是在什么情况下开始写入 jms_messages 的?

最后一个问题 - 下面的容器配置设置是否对我看到的处理消息的线程数有任何影响?

<container-pool-conf>
    <MaximumSize>500</MaximumSize>
<container-pool-conf>

谢谢你。

4

1 回答 1

1

自从我需要使用 JBoss MQ 以来已经有很长时间了......所以它并不能真正回答您的(有趣的)问题,但无论如何可能会有所帮助。

如果您使用内置的 HSQL 数据库作为 JBoss MQ 的消息存储,那么您将无法处理像在短时间内发送的 15k 条消息这样的负载。你需要切换到一个真正的数据库,除非你想放弃持久性消息存储(据我记得你可以配置它),这对性能有好处,但有些消息可能会永远丢失。

JBoss MQ 并不是有史以来最好的 JMS 提供者。事实上,它几乎不是生产就绪的解决方案,使用它真的很痛苦(没有好的文档,奇怪的配置,你现在正在经历的事情)。这就是为什么 JBoss 人从 JBoss 5.X 切换到 JBoss Messaging(实际上在商业 JBoss 4.X EAP - 而不是 GA - 他们一直在使用 JBoss Messaging)。

不是最好的选择是切换到 HornetQ - 它有据可查、功能强大并且可以处理非常大的负载。

于 2013-03-17T19:06:03.060 回答