4

我尝试使用 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
}    
4

1 回答 1

1

由于 Petter 指出 ActiveMQ 或 Spring 配置不会有问题,因此我在 java 中创建了一个 spring 消费者,并试图找到与我的 grails 消费者不同的地方。

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

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

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

于 2012-08-16T07:55:52.150 回答