Transactions DMLC中SessionTransact=true和SessionTransact=false之间的差异

Transactions DMLC中SessionTransact=true和SessionTransact=false之间的差异,transactions,jms,activemq,spring-jms,Transactions,Jms,Activemq,Spring Jms,通过谷歌搜索,我知道如果我使用sessionTransact=false,DMLC将使用确认模式(自动、客户端等),如果我使用sessionTransact=true,它将在侦听器执行后执行session.commit 我看到了两种模式之间的巨大性能差异。与sessionTransact=true相比,sessionTransact=false给了我很多性能提升。 我使用非持久性消息传递和ActiveMQ作为JMS提供程序。我使用spring DMLC来消费消息 根据这一点,应该没有太大区别,因

通过谷歌搜索,我知道如果我使用sessionTransact=false,DMLC将使用确认模式(自动、客户端等),如果我使用sessionTransact=true,它将在侦听器执行后执行session.commit

我看到了两种模式之间的巨大性能差异。与sessionTransact=true相比,sessionTransact=false给了我很多性能提升。 我使用非持久性消息传递和ActiveMQ作为JMS提供程序。我使用spring DMLC来消费消息

根据这一点,应该没有太大区别,因为session.commit和Message.acknowledge都是阻塞调用

两个问题:

  • 为什么在这些情况下会出现性能差异
  • 在ActiveMQ/JMS提供程序发回响应之前,session.commit和Message.acknowledge调用是否都会阻塞?这在内部是如何工作的
  • 连接工厂配置:

        <!-- 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:

    
    

    在我将SessionTransact设置为false后,DMLC能够快速处理消息。这正是让我好奇的地方。

    我没有答案,但如果您不使用事务,并且不希望消息丢失(在侦听器失败的情况下),您应该使用SimpleMessageListenerContainer而不是DMLC,因为后者会在调用侦听器之前确认消息。根据,如果我使用自动确认模式,DMLC也会在调用侦听器之前确认。是;我就是这么说的。SMLC在侦听器返回后确认。很抱歉我误读了你的评论。在我的例子中,如果消息在侦听器调用之前被确认,那么tts是可以的。根据本文的讨论,在侦听器执行完成之前,不会调用receive(),因此可以。但是,如果侦听器崩溃或断电,消息将丢失。
        <!-- 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"/>