提交事务处理的持久性AMQ消息时观察到大量延迟

时间:2013-12-17 15:37:22

标签: jms activemq

我有以下AMQ使用者配置文件,它试图从队列中使用“持久”消息。此外,消息是“事务处理”(因为如果无法以预期的方式处理消息,我需要回滚)。

我发现此配置存在问题:  每当消费者在消费消息后调用session.commit()时,我都会看到提交调用需要大约8秒钟才会出现。我相信这不是预期的。

如果我对以下配置有任何问题,有人可以指点我吗?

  <bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
    <property name="brokerURL" value="tcp://localhost:61616"/>
  </bean>

  <bean id="simpleMessageListener" class="listener.StompSpringListener"  scope="prototype" />

  <bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
    <property name="physicalName" value="JOBS.notifications"/>
  </bean>

  <bean id="poolMessageListener" class="org.springframework.aop.target.CommonsPoolTargetSource">
    <property name="targetBeanName" value="simpleMessageListener"/>
    <property name="maxSize" value="200"/>
  </bean>

  <bean id="messageListenerBean" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="targetSource" ref="poolMessageListener"/>
  </bean>

  <jms:listener-container 
         container-type="default" 
         connection-factory="amqConnectionFactory" 
         acknowledge="transacted" 
         concurrency="200-200"
         cache="consumer"
         prefetch="10">

    <jms:listener destination="JOBS.notifications" ref="messageListenerBean" method="onMessage"/> 
  </jms:listener-container>

1 个答案:

答案 0 :(得分:0)

查看ActiveMQ Spring support页面。我立即看到的是您应该使用PoolingConnectionFactory而不是ActiveMQConnectionFactory。这将确保从代码中仅为代理设置单个TCP连接,并将在轮询线程之间共享。