Java SpringJMS如何在持久主题侦听器之间分发消息?

Java SpringJMS如何在持久主题侦听器之间分发消息?,java,spring,jms,spring-jms,jms-topic,Java,Spring,Jms,Spring Jms,Jms Topic,原始jms代码: TopicSubscriber durSubscriber1 = receiverSession.createDurableSubscriber(topic,"subscription_1"); durSubscriber1.setMessageListener(new MessageListener() { @Override public void onMessage(Message message) { RMQTextMessage rm

原始jms代码:

TopicSubscriber durSubscriber1 = receiverSession.createDurableSubscriber(topic,"subscription_1");
durSubscriber1.setMessageListener(new MessageListener() {
    @Override
    public void onMessage(Message message) {

        RMQTextMessage rmqTextMessage = ((RMQTextMessage) message);
        try {
            System.out.println("sub_1:" + rmqTextMessage.getText());
        } catch (JMSException e) {
            e.printStackTrace();
        }

    }
});


TopicSubscriber durSubscriber2 = receiverSession.createDurableSubscriber(topic,"subscription_2");
    durSubscriber2.setMessageListener(new MessageListener() {
        @Override
        public void onMessage(Message message) {

            RMQTextMessage rmqTextMessage = ((RMQTextMessage) message);
            try {
                System.out.println("sub_2:" + rmqTextMessage.getText());
            } catch (JMSException e) {
                e.printStackTrace();
            }

        }
});
当我使用以下代码时,每个侦听器都会获得所有消息。如果我使用相同的订阅名称-应用程序不会启动

另一方面,我编写了使用spring jms的代码:

配置:

@Bean
public JmsListenerContainerFactory<?> myFactory(DefaultJmsListenerContainerFactoryConfigurer configurer, ConnectionFactory connectionFactory) {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    // This provides all boot's default to this factory, including the message converter
    configurer.configure(factory, connectionFactory);
    // You could still override some of Boot's default if necessary.
    factory.setPubSubDomain(true);
    factory.setSubscriptionDurable(true);
    return factory;
}
@JmsListener(destination = "my_topic_new", containerFactory = "myFactory")
public void receiveTopic(Email email) {
    System.out.println("list_1:" + email);
}

@JmsListener(destination = "my_topic_new", containerFactory = "myFactory")
public void receiveTopicDup(Email email) {
    System.out.println("list_2:" + email);
}
在这种情况下,两个侦听器都划分消息。我的意思是,如果生产者发送10条消息,那么监听器1将收到N条消息,监听器2将收到M条消息。
M+N=10

请在两个代码片段中解释差异。
您能为SpringJMS版本提供相应的jms代码吗?

这是因为RabbitJMS客户端将jms映射到本机AMQP的方式。您必须给每个侦听器一个订阅名称;否则,它们将在同一队列中竞争消息

@JmsListener(destination = "my_topic_new", containerFactory = "myFactory", subscription = "foo")
public void receiveTopic(String email) {
    System.out.println("list_1:" + email);
}

@JmsListener(destination = "my_topic_new", containerFactory = "myFactory", subscription = "bar")
public void receiveTopicDup(String email) {
    System.out.println("list_2:" + email);
}
这仅适用于持久订阅