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

Java JMS发布者/订阅者模型中的并发使用者,java,concurrency,publish-subscribe,spring-jms,Java,Concurrency,Publish Subscribe,Spring Jms,我正在使用带有DefaultMessageListenerContainer的发布/订阅模型。我已将并发使用者配置为5。如何唯一标识每个消费者 我试图将相应侦听器处理的每个事件存储在映射中。这是我正在努力寻找哪个消费者处理了我的事件的部分。我该怎么做 关键是如何在并发消费者情况下唯一地识别消费者。 我对DMLC的配置是 @Bean public DefaultMessageListenerContainer listenerContainers() { DefaultMe

我正在使用带有DefaultMessageListenerContainer的发布/订阅模型。我已将并发使用者配置为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参数?我应该使用相同的ConnectionFactorybean还是创建5个不同的具有不同客户端ID的连接工厂bean

编辑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;
    } 
我的问题仍然是,既然两个侦听器执行相同的操作,我如何识别哪个侦听器正在处理


还要告诉我我的配置是否正确?

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

如果这确实是您想要的,那么您需要5个并发性为1的容器


标准JMS不支持主题上的竞争消费者某些代理对此进行了扩展,但您必须参考代理的文档。

实际上,我希望使这些消费者持久耐用。我的配置能正常工作吗?你能建议一种方法,让所有5个消费者都能收到消息,并且它们是持久的,我必须能够识别它们吗?你能看到编辑部分并澄清所需的ConnectionFactory吗?只要你使用这样一个简单的ConnectionFactory,你就可以在容器上而不是在工厂上设置clientId。或者你可以使用5个CFs。嘿,加里,看看编辑2。请回答这个问题。您需要为每个侦听器实例分别配置一个侦听器实例,并使用客户端id对其进行配置。也就是说,这个用例对我来说似乎很奇怪。现在还不清楚你想要实现什么。