concurrentMons队列的并发消费者

时间:2012-08-14 16:31:50

标签: spring activemq

我尝试使用grails中的ActiveMQ队列消息。我为连接配置了一些spring bean,到目前为止一切都很好。

当我尝试将concurrentConsumers设置为高于8时,问题就出现了。似乎8被设置为一个客户端的最大值 - 如果配置超过8,则ActiveMQ资源管理器仍会显示8个队列消费者。如果我为超过8 concurrentConsumers的不同队列配置两个侦听器,则ActiveMQ oszillate显示的消费者数量,但总和总是为8。

我做错了什么?配置示例显示最多50个并发消费者...

这是我的配置,写作groovy DSL,我想读它没问题...

jmsFactory(org.apache.activemq.pool.PooledConnectionFactory) { bean ->
    bean.destroyMethod = "stop"
    connectionFactory = { org.apache.activemq.ActiveMQConnectionFactory cf ->
        brokerURL = "tcp://localhost:61616"
    }
}
jmsTemplate(org.springframework.jms.core.JmsTemplate) {
    connectionFactory = jmsFactory
}
jmsMessageListener(org.springframework.jms.listener.adapter.MessageListenerAdapter, ref("messageService")) {
    defaultListenerMethod = "onMessage"
}
jmsContainer(org.springframework.jms.listener.DefaultMessageListenerContainer) {
    connectionFactory = jmsFactory
    concurrency="10"
    concurrentConsumers="15"
    destinationName = "demoQueue"
    messageListener = jmsMessageListener
    transactionManager = ref("transactionManager")
    autoStartup = false
}    
jmsMessageListener2(org.springframework.jms.listener.adapter.MessageListenerAdapter, ref("messageService")) {
    defaultListenerMethod = "onMessage2"
}
jmsContainer2(org.springframework.jms.listener.DefaultMessageListenerContainer) {
    connectionFactory = jmsFactory
    destinationName = "demoQueue2"
    messageListener = jmsMessageListener2
    transactionManager = ref("transactionManager")
    autoStartup = false
}    

1 个答案:

答案 0 :(得分:1)

由于Petter指出它不是ActiveMQ或Spring配置的问题,我在java中创建了一个spring consumer并试图找到与我的grails使用者不同的东西。

java使用者按预期工作,但不使用事务管理器。所以我从我的grails confid中删除了事务管理器,它确实有效!

然后我用Google搜索了一下,发现了cacheLevel设置的提示:http://static.springsource.org/spring/docs/2.0.8/api/org/springframework/jms/listener/DefaultMessageListenerContainer.html#setCacheLevel%28int%29

使用事务管理器时,cacheLevel设置为none - bingo!如果我现在将cacheLevel设置为CACHE_CONSUMER,那么一切都按预期工作......