JMS发布者/订阅者模型中的并发使用者

时间:2017-10-03 01:47:48

标签: java concurrency publish-subscribe spring-jms

我正在使用带有DefaultMessageListenerContainer的pub / sub模型。我已将并发消费者配置为5.如何唯一标识每个消费者?

我正在尝试将相应侦听器处理的每个事件存储在地图中。这是我努力寻找哪个消费者处理我的活动的部分。我怎么能这样做?

关键是如何在并发消费者情况下唯一地识别消费者。 我对DMLC的配置是

@Bean
    public DefaultMessageListenerContainer listenerContainers() {
        DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
        container.setConnectionFactory(connectionFactory());
        container.setDestinationName(COMMENT_QUEUE);
        container.setPubSubDomain(true);
        container.setSessionTransacted(true);
        container.setConcurrentConsumers(5);
        container.setSubscriptionDurable(true);
        container.setMessageListener(datafileSubscriber);
        container.start();
        return container;
    } 

如您所知,这将使datafilesubscriber在5个不同的线程中执行。 编辑: 我听说我们需要一个带有单独客户端ID的connectionfactory。

  @Bean
        public ActiveMQConnectionFactory connectionFactory(){
            ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
            connectionFactory.setBrokerURL(DEFAULT_BROKER_URL);
            connectionFactory.setClientID("subscriber");
            return connectionFactory;
        }

所以现在我的问题是我应该如何处理dmlc中的connectionFactory参数?我应该使用相同的connectionFactory bean还是使用不同的客户端ID创建5个不同的。

编辑2: 我的2个侦听器的示例代码订阅了相同的主题,两者都是持久的消费者。当消息发布到主题时,它们都接收消息,其中一个处理消息而另一个忽略它,因为它在缓存中看到另一个侦听器处理它。 我的配置是

@Bean
    public ActiveMQConnectionFactory connectionFactory(){
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
        connectionFactory.setBrokerURL(DEFAULT_BROKER_URL);
        return connectionFactory;
    }
@Bean
    public DefaultMessageListenerContainer listenerContainers() {
        DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
        container.setConnectionFactory(connectionFactory());
        //container.setConnectionFactory(connectionFactory1());
        container.setClientId("consumer1");
        container.setDestinationName(COMMENT_QUEUE);
        container.setPubSubDomain(true);
        container.setSessionTransacted(true);
        container.setSubscriptionDurable(true);
        container.setMessageListener(datafileSubscriber);
        container.start();
        return container;
    }

    @Bean
    public DefaultMessageListenerContainer listenerContainers1() {
        DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
        container.setConnectionFactory(connectionFactory());
        container.setClientId("consumer2");
        container.setDestinationName(COMMENT_QUEUE);
        container.setPubSubDomain(true);
        container.setSessionTransacted(true);
        container.setSubscriptionDurable(true);
        container.setMessageListener(datafileSubscriber);
        container.start();
        return container;
    } 

我的问题仍然是一样的,我如何识别哪个侦听器正在处理,因为两个侦听器都执行相同的操作?

还告诉我配置是否正确?

1 个答案:

答案 0 :(得分:1)

对主题使用并发没有多大意义,因为消息侦听器将获得相同的消息5次。

如果这真的是你想要的,你需要5个并发= 1的容器。

标准JMS不支持竞争消费者的主题(一些经纪人对此有扩展,但您必须参考您的经纪人的文档)。