我创建了一个基于spring,jms和activemq的简单的生产者消费者模拟,我试图从生产者和消费者双方获得高性能,
连接设置:
<tx:annotation-driven /> <bean id="transactionManager" class="org.springframework.jms.connection.JmsTransactionManager"> <property name="connectionFactory" ref="connectionFactory" /> </bean> <amq:connectionFactory id="amqConnectionFactory" brokerURL="failover:(tcp://${broker.url}:61616)" /> <bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory"> <property name="targetConnectionFactory" ref="amqConnectionFactory" /> </bean> <amq:queue id="queue" physicalName="queue" /> <beans:bean id="jsonMessageConverter" class="XXXXX.converter.JsonMessageConverter" />
消费者设置:
<jms:listener-container concurrency="10" acknowledge="auto" prefetch="1" message-converter="jsonMessageConverter" transaction-manager="transactionManager" > <jms:listener id="queueListener_1" destination="ooIntegrationQueue" ref="myMessageListenerAdapter" /> </jms:listener-container> <beans:bean id="myMessageListenerAdapter" class="org.springframework.jms.listener.adapter.MessageListenerAdapter" > <beans:property name="delegate" ref="consumer"/> </beans:bean> <beans:bean id="consumer" class="XXX.ConsumerImpl"/>
生产者设置:
<beans:bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate" p:connectionFactory-ref="connectionFactory" p:messageConverter-ref="jsonMessageConverter" p:defaultDestination-ref="ooIntegrationQueue" p:sessionTransacted="true" />
从消费者开始,我设法每秒消耗大约25条消息,这非常慢,我发现瓶颈是我正在使用事务,在谷歌搜索了一段时间之后,并使用了配置,我发现自动装配DefaultMessageListenerContainer并将缓存级别更改为
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它时,使用的是同步发送。这会大大降低性能。您可以将ActiveMQConnectionFactory的useAsyncSend属性设置true为强制异步发送。此处有更多详细信息:JmsTemplate不是邪恶的
JmsTemplate
JMS
ActiveMQ
ActiveMQConnectionFactory
useAsyncSend
true