jms生产商与春天的表现

Mat*_*tan 23 java spring activemq-classic jms spring-jms

我创建了一个基于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" />
Run Code Online (Sandbox Code Playgroud)

消费者设置:

<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"/>
Run Code Online (Sandbox Code Playgroud)

制片人设置:

<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" />
Run Code Online (Sandbox Code Playgroud)

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

listenerContainer.setCacheLevelName("CACHE_SESSION") 
Run Code Online (Sandbox Code Playgroud)

我的性能增加到每秒约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);
Run Code Online (Sandbox Code Playgroud)

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

小智 15

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


Jak*_*rab 5

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