ActiveMQ是否支持多个交易消费者?

时间:2015-05-14 10:17:08

标签: transactions apache-camel activemq apache-servicemix

我正在开发ServiceMix中的OSGI包,以便从ActiveMQ的同一队列中使用。

我需要确保只有在每件事情都顺利的情况下才能将信息出列,以免我丢失该信息。所以我使用了camel事务客户端。我按照本教程http://camel.apache.org/transactional-client.html

来实现它

然而,问题在于,当从同一队列部署许多捆绑包时,我只有一个消费者同时工作。

如何在ActiveMQ中启用并行事务消耗?

提前致谢。

此致

这是我的实现(仅从教程中复制):

骆驼路线:

   <route>
      <from uri="activemq:queue:foo"/>
      <transacted ref="required"/>
      <process ref="myProcessor"/>
      <to uri="activemq:queue:bar"/>
    </route>

Spring背景:

<!-- setup JMS connection factory -->
<bean id="poolConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory">
    <property name="maxConnections" value="8"/>
    <property name="connectionFactory" ref="jmsConnectionFactory"/>
</bean>

<bean id="jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
    <property name="brokerURL" value="vm://localhost?broker.persistent=false&amp;broker.useJmx=false"/>
</bean>

<!-- setup spring jms TX manager -->
<bean id="jmsTransactionManager" class="org.springframework.jms.connection.JmsTransactionManager">
    <property name="connectionFactory" ref="poolConnectionFactory"/>
</bean>

<!-- define our activemq component -->
<bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="connectionFactory" ref="poolConnectionFactory"/>
    <!-- define the jms consumer/producer as transacted -->
    <property name="transacted" value="true"/>
    <!-- setup the transaction manager to use -->
    <!-- if not provided then Camel will automatic use a JmsTransactionManager, however if you
         for instance use a JTA transaction manager then you must configure it -->
    <property name="transactionManager" ref="jmsTransactionManager"/>
</bean>

2 个答案:

答案 0 :(得分:2)

我终于在http://activemq.2283324.n4.nabble.com/Blocking-transactions-td2354801.html;cid=1431937246689-831找到了解决方案。

问题是由于预取限制。当有多个消费者时,建议将其设置为0,即使它们不是交易的。

所以我必须通过这种方式添加?destination.consumer.prefetchSize = 0 来改变我的骆驼路线:

<route> 
<from uri="activemq:queue:foo?destination.consumer.prefetchSize=0"/>
<transacted ref="required"/> <process ref="myProcessor"/>
<to uri="activemq:queue:bar"/>
</route>

答案 1 :(得分:0)

可以让ActiveMQ JMS的并发使用者。

<bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
    <property name="connectionFactory" ref="pooledConnectionFactory" />
    <property name="transacted" value="true" />
    <property name="concurrentConsumers" value="10" />
    <property name="deliveryPersistent" value="true" />
    <property name="requestTimeout" value="20000" />
    <property name="cacheLevelName"  value="CACHE_CONSUMER" />
</bean>
相关问题