0

我正在做一个项目,我们有一个高吞吐量的 jms 消息生产(顺便说一下,还有消费者)。一些测试让我相信我无法在最好的情况下正确使用 JMS 消息生成。首先让我解释一下场景:我们有一个带有 13 个队列的 Weblogic 集群(2 个节点)。消息在 UDP 侦听器 (Netty) 上接收,并创建一个分配在第一个队列上的 ByteMessage,依此类推。通过一些分析,我发现这第一步不需要很长时间来执行,而且它的消费者也没有,但是消息仍然在队列中停留了很长一段时间。它们是非持久性的,交付时间为 0(零)。一个改进是缓存 de connectionFactory、ConnectionQueue、Queue 和 QueueSession 并像永远一样使用它们。但这不可能。我的意思是,我们不应该打开这些资源,也永远不要关闭它们,对吧?真正应该缓存什么以及何时应该释放连接和会话?我应该为要发送的每条消息创建一个会话还是可以重复使用它?我的意思是,考虑到正确的资源处理,在队列上生成大量 jms 消息(每秒 300 条左右)的最佳方法是什么?我被困在这里,我发现的所有来源都告诉我在工作完成但它从未完成时总是关闭(它总是会收到大量消息)。考虑到正确的资源处理,在队列上生成大量 jms 消息(每秒 300 条左右)的最佳方法是什么?我被困在这里,我发现的所有来源都告诉我在工作完成但它从未完成时总是关闭(它总是会收到大量消息)。考虑到正确的资源处理,在队列上生成大量 jms 消息(每秒 300 条左右)的最佳方法是什么?我被困在这里,我发现的所有来源都告诉我在工作完成但它从未完成时总是关闭(它总是会收到大量消息)。

提前问候。

编辑:我忘了说 MDB 有默认的 16 个消费者大小,理论上考虑到单个消息所花费的处理时间,应该足以消耗所有消息而无需“存储”它们。

4

1 回答 1

2

您需要缓存 JMS 对象。

如果您使用的是 Java EE 服务器,那么它应该为您执行此操作。我相信这是可配置的。

https://community.jboss.org/wiki/ShouldICacheJMSConnectionsAndJMSSessions

连接、会话、消费者和生产者等 JMS 对象被设计为可重用。在大多数实现中,连接和会话的设置非常重要,消费者通常需要网络往返来设置。Producer 通常更轻量级,尽管创建它通常会有一些开销。

Spring 还提供连接和会话缓存包装器。

调整 WebLogic JMS http://docs.oracle.com/cd/E28280_01/web.1111/e13814/jmstuning.htm

于 2013-04-23T05:10:11.647 回答