2013-04-23 121 views
0

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

提前问候。

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

回答

2

您需要缓存JMS对象。

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

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

JMS像连接,会话,消费者和生产者的对象被 设计成可重复使用。在大多数实现中,连接和会话 的设置相当重量级,而且消费者通常需要设置网络往返的 。生产者通常更轻, ,虽然在创建它往往有一些开销。

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

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

+0

我喜欢简单地注入这些对象。 但它是客户禁止使用DI的遗留系统。我不知道为什么。 因此,使用EJB和MDB是可以的,但我需要查找所有内容才能使事情顺利进行。 我仍然应该缓存我引用的所有这些对象类型吗?谢谢! – Marcelo 2013-04-23 12:49:46

+0

我还在做一些测试,但看起来你的消息来源帮了我很多! – Marcelo 2013-04-23 14:17:32

+0

我写了一个答案,它似乎消失在某处..从JNDI获取对象大部分与DI相同。 Java EE服务器(和WebLogic Server)也在适当的情况下为JNDI中的JMS对象提供对象缓存。正如你所提到的,关于在文档中微调基础结构有很多有用的信息。很高兴它帮助! – Vitaly 2013-04-23 14:36:25