4

Grails で ActiveMQ キューからメッセージを消費しようとしています。接続用にいくつかのSpring Beanを構成しましたが、これまでのところすべてうまく機能しています。

上記の 8を設定しようとすると、問題が発生しconcurrentConsumersます。1 つのクライアントに対して 8 が最大として設定されているようです。8 を超える数を設定しても、ActiveMQ エクスプローラーはキューに対して 8 つのコンシューマーを表示します。8 を超える異なるキューに対して 2 つのリスナーを構成するとconcurrentConsumers、ActiveMQ によって表示されるコンシューマーの数は変化しますが、合計は常に 8 です。

私は何を間違っていますか?構成例は、最大 50 の concurrentConsumers を示しています...

これが私の設定で、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コンシューマーは期待どおりに機能しますが、トランザクションマネージャーを使用しません。だから私は私のgrailsconfidからトランザクションマネージャーを削除しました、そしてそれはうまくいきます!

次に、少しグーグルして、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に設定すると、すべてが期待どおりに機能します...

于 2012-08-16T07:55:52.150 に答える