DMLC中sessionTransacted = true和sessionTransacted = false之间的差异

时间:2015-02-24 07:55:35

标签: transactions jms activemq spring-jms

通过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都阻塞了调用,所以不应该有太大区别。

两个问题:

  1. 为什么这些情况会有性能差异?
  2. 是否会调用session.commit和Message.acknowledge阻塞,直到ActiveMQ / JMS提供程序发回响应?这在内部如何运作?
  3. 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能够快速处理消息。这就是让我好奇的原因。

0 个答案:

没有答案