jms制作人与spring的表现

我创建了一个基于spring,jms和activemq的简单的生产者消费者模拟,我试图从双方,生产者和消费者那里获得高性能,

连接设置:

          

消费者设置:

        

制片人设置:

  

从消费者开始,我设法每秒消耗大约25条消息,这非常慢,我发现瓶颈是我正在使用交易,谷歌搜索一下,然后玩配置,我发现自动assemblyDefaultMessageListenerContainer并将cachelevel更改为

 listenerContainer.setCacheLevelName("CACHE_SESSION") 

我的性能增加到每秒约1500条消息,同时仍然有交易。

我的问题是现在生产者仍然停留在每秒约25次操作,我的生产者测试很简单:

 int numOfMessages = getNumberOfMessages(); double startTime = System.currentTimeMillis(); for (int i = 1; i <= numOfMessages; i++) { jmsTemplate.convertAndSend("HelloWorld" + i); } double endTime = System.currentTimeMillis(); double totalTime=(endTime-startTime)/1000; System.out.println("Time - "+totalTime+" seconds"); System.out.println("EPS - "+numOfMessages/totalTime); 

我想知道如何与制作人达成类似的表演,因为它现在已经成为整个系统的瓶颈。

对不起,如果这个答案来得太晚,以帮助原始海报。 我最近调查了JmsTemplate性能。 即使使用相同的传递和确认模式,本机JMS代码似乎比JmsTemplate快得多。 问题原来是ActiveMQ通常默认为异步发送,但是当你使用JmsTemplate它反而使用同步发送。 这大大降低了性能。 您可以将ActiveMQConnectionFactoryuseAsyncSend属性设置为true以强制执行异步发送。 更多细节: JmsTemplate不是邪恶的

JMSTemplate使用ConnectionFactiory – > Connection – > Session – > MessageProducer,每次发送后关闭每个对象。 要解决此问题,请使用org.apache.activemq.pool.PooledConnectionFactory包装amqConnectionFactory bean,并在模板下使用它而不是CachingConnectionFactory。

尝试将确认方法更改为从AUTO到CLIENT_ACKNOWLEDGE。 有关更多信息,请参阅规范 。

ActiveMQ的默认传送模式是什么? 它是一个持久队列吗? 如果是这样,它是如何配置的? 经纪人有多远? 这些答案将通过回答服务器响应发送所需的时间来确定发送到队列的基本成本(即网络RTT +同步将消息持久保存到磁盘的潜在成本)。

另一种可能性是,您实际上是在每次发送时创建新的连接,会话和消息生成器。 至少可以说这是非常昂贵的。 值得确认是否发生这种情况(例如,将调试日志记录添加到spring,检查amq管理控制台是否存在连接流失)或不作为基本的健全性检查。 根据它的外观, CachingConnectionFactory应该默认缓存单个会话和messageproducer, CachingConnectionFactory应该关闭它在发送后获得的会话,这会导致将缓存的会话返回到池。 这应该意味着它相对较快(Spring jms经历了大量的代码只是为了发送消息)以在下一次发送时获得缓存的会话。