java - jms 生产者性能与 Spring

标签 java spring jms activemq 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" />

消费者设置:

<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 条消息,这非常慢,我发现瓶颈在于我正在使用事务, 在谷歌搜索了一下并使用配置后,我发现在 Autowiring 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 的性能。即使使用相同的交付和确认模式, native JMS 代码似乎也比 JmsTemplate 快得多。问题原来是 ActiveMQ 通常默认为异步发送,但是当您使用 JmsTemplate 时,它改为使用同步发送。这会大大降低性能。您可以将 ActiveMQConnectionFactoryuseAsyncSend 属性设置为 true 以强制异步发送。更多详情:JmsTemplate is not evil

关于java - jms 生产者性能与 Spring ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7056241/

相关文章:

java - Maven 2.2.1 附加测试。问题-Dmaven.test.skip=true

java - 在 Java JMS Spring 中为方法参数声明 Final

java - JMS 客户端应用程序和业务 Activity 监视器

jms - 如何在Spring集成中设置每个出站jms消息的优先级?

java - Primefaces selectManyCheckbox

java - 在简单子(monad)类之间复制的简单方法

java - 为什么在 Tomcat 加载和读取 beans.xml 时没有正确加载 Spring AOP XML 模式

java - 带有 Spring 注解的复合设计模式

javascript - 如何提高 xPage 上的 typeAhead 性能?

java - 关于解决方案的问题