ConcurrentConsumers不是使用DefaultMessageListenerContainer创建的,而是在PooledConnectionFactory上使用maximumActiveSessionsPerConnection

时间:2015-08-01 01:38:24

标签: activemq spring-jms

我有以下Java类。与CachingConnectionFactory一起使用时,它会在ConcurrentConsumers上创建配置的DefaultMessageListenerContainer个设置。但是,如果使用的是PooledConnectionFactory而不是CachingConnectionFactory,则只会创建concurrentConsumers等于maximumActiveSessionPerConnection上设置的PooledConnectionFactory,而不是设置为concurrentConsumers的数量DefaultMessageListenerContainer

如何确保DefaultMessageListenerContainer使用PooledConnectionFactory提供的多个连接/会话,并为concurrentConsumer创建已配置的DefaultMessageListenerContainer import javax.jms.Session; import org.apache.activemq.ActiveMQConnectionFactory; import org.apache.activemq.command.ActiveMQQueue; import org.apache.activemq.jms.pool.PooledConnectionFactory; import org.springframework.jms.listener.DefaultMessageListenerContainer; public class ActiveMQMainTest { public static void main(String[] args) { String queueUrl = "tcp://localhost:61616"; ActiveMQQueue queue = new ActiveMQQueue("request.queue"); final ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(queueUrl); PooledConnectionFactory pooledConnectionFactory = new PooledConnectionFactory(); pooledConnectionFactory.setConnectionFactory(connectionFactory); pooledConnectionFactory.setCreateConnectionOnStartup(false); pooledConnectionFactory.setMaxConnections(5); pooledConnectionFactory.setMaximumActiveSessionPerConnection(100); pooledConnectionFactory.start(); // CachingConnectionFactory pooledConnectionFactory = new CachingConnectionFactory(connectionFactory); DefaultMessageListenerContainer defaultMessageListenerContainer = new DefaultMessageListenerContainer(); defaultMessageListenerContainer.setConnectionFactory(pooledConnectionFactory); defaultMessageListenerContainer.setDestination(queue); defaultMessageListenerContainer.setSessionAcknowledgeMode(Session.AUTO_ACKNOWLEDGE); defaultMessageListenerContainer.setConcurrentConsumers(5); defaultMessageListenerContainer.setMaxConcurrentConsumers(5 * 2); defaultMessageListenerContainer.setCacheLevel(DefaultMessageListenerContainer.CACHE_NONE); defaultMessageListenerContainer.setSessionTransacted(true); JmsMessageListener messageListener = new JmsMessageListener(); defaultMessageListenerContainer.setMessageListener(messageListener); defaultMessageListenerContainer.afterPropertiesSet(); defaultMessageListenerContainer.start(); try { Thread.sleep(1000 * 60 * 10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 。下面是检查相同内容的简单示例。

var values = ['51', '127', ...];

$("#select option").filter(function(i, opt) {
    return $.inArray(opt.value, values) > -1;
}).remove();

1 个答案:

答案 0 :(得分:0)

DMLC默认使用共享连接(当没有事务管理器时)。可以使用以下方法禁用它:

dmlc.setCacheLevel(DefaultMessageListenerContainer.CACHE_NONE);

你通常也应该使用DMLC setSessionTransacted(true),以避免丢失消息的可能性(使用DMLC,在调用监听器之前确认消息),使用本地事务,ack不会去听经纪人,直到听众正常退出。