通过Google搜索,我知道如果我使用sessionTransacted = false,DMLC将使用确认模式(自动,客户端等),如果我使用sessionTransacted = true,它将在侦听器执行后执行session.com。
我发现这两种模式之间存在巨大的性能差异。与sessionTransacted = true相比,sessionTransacted = false给了我很多性能提升。 我使用非持久消息传递和ActiveMQ作为JMS提供程序。我正在使用spring DMLC来消费消息。
根据这个http://activemq.apache.org/should-i-use-transactions.html,因为session.com和Message.acknowledge都阻塞了调用,所以不应该有太大区别。
两个问题:
ConnectionFactory配置:
<!-- ActiveMQ connection factory to establish connection with broker. -->
<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="${broker.url}"/>
</bean>
<!-- Wrap in a pool to avoid creating a connection per send. -->
<bean id="consumerJmsConnectionFactory"
class="org.apache.activemq.pool.PooledConnectionFactory"
destroy-method="stop">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="maxConnections" value="6" /> <!-- Default is 1 ! -->
</bean>
最大连接数为6,因为我有其他DMLC使用相同的池连接工厂。
DMLC:
<!-- Message listener container to receive messages from JshProxy. -->
<bean id="jshProxyListenerContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer"
p:connectionFactory-ref="consumerJmsConnectionFactory"
p:destination-ref="jshProxyPushTopic"
p:pubSubDomain="true"
p:subscriptionDurable="false"
p:sessionTransacted="false"
p:clientId="${cometd.jshProxyPush.clientId}"
p:messageListener-ref="cometDActiveMQListener"/>
在将sessionTransacted设为false后,DMLC能够快速处理消息。这就是让我好奇的原因。