我创建了一个基于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 …Run Code Online (Sandbox Code Playgroud) 这里与Spring CachingConnectionFactory相关的java doc 有评论:
注意:此ConnectionFactory需要显式关闭从其共享Connection获取的所有Sessions.无论如何,这是本机JMS访问代码的通常建议.但是,使用此ConnectionFactory,必须使用它才能实际允许会话重用.
我不清楚如何使用我的应用程序中的以下给定配置来处理这个问题.
<bean id="springApp" class="com.codereq.springcore.jms.SpringJMSListenerApp" />
<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="jmsConnectionFactory"/>
<property name="destination" ref="destination"/>
<property name="messageListener" ref="messageListener"/>
<property name="sessionTransacted" value="true"/>
<property name="concurrentConsumers" value="5" />
<property name="maxConcurrentConsumers" value="15" />
</bean>
<bean id="messageListener" class="com.codereq.springcore.jms.MessageListenerApp" />
<bean id="jmsConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory"
p:targetConnectionFactory-ref="emsConnectionFactory"
p:sessionCacheSize="100"
p:cacheConsumers="true" />
<bean id="emsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="GenericConnectionFactory"/>
<property name="jndiTemplate" ref="jndiTemplate"/>
</bean>
<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.factory.initial">com.tibco.tibjms.naming.TibjmsInitialContextFactory</prop>
<prop key="java.naming.provider.url">tibjmsnaming://localhost:7222</prop>
<prop key="java.naming.security.principal">admin</prop>
<prop key="java.naming.security.credentials">admin</prop>
</props>
</property>
</bean>
<bean id="destination" class="com.tibco.tibjms.TibjmsQueue">
<constructor-arg value="com.sample.queue" />
</bean> …Run Code Online (Sandbox Code Playgroud) 我遇到了ActiveMQ和Spring的问题CachingConnectionFactory.我把它们设置成这样:
<!-- A connection to ActiveMQ -->
<bean id="myConnectionFactory"
class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="${jms.url}"/>
<property name="userName" value="${jms.username}"/>
<property name="password" value="${jms.password}"/>
</bean>
<!-- A cached connection to wrap the ActiveMQ connection -->
<bean id="myCachedConnectionFactory"
class="org.springframework.jms.connection.CachingConnectionFactory">
<property name="targetConnectionFactory" ref="myConnectionFactory"/>
<property name="sessionCacheSize" value="10"/>
<property name="reconnectOnException" value="true"/>
</bean>
<!-- A destination in ActiveMQ -->
<bean id="myDestination"
class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg value="${jms.queue}" />
</bean>
<!-- A JmsTemplate instance that uses the cached connection and destination -->
<bean id="myProducerTemplate"
class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="myCachedConnectionFactory"/>
<property name="defaultDestination" ref="myDestination"/>
</bean> …Run Code Online (Sandbox Code Playgroud)