java - spring jms 如何在持久主题监听器之间分发消息?

标签 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 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 条消息,那么 Listener_1 将收到 N 条消息,Listener_2 将收到 M 条消息。
M+N=10

请解释 2 个代码片段的差异。 能否提供spring-jms版本对应的jms代码?

最佳答案

这是由于rabbit JMS客户端将JMS映射到 native 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);
}

这仅适用于持久订阅。

关于java - spring jms 如何在持久主题监听器之间分发消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45837980/

相关文章:

java - 使用 Jaxb2Marshaller 防止解析包含 DTD 的 XML 文件

unit-testing - 如何使用 Java DSL 测试 Camel JMS 路由

javax.jms.JMSSecurityException : MQJMS2008: failed to open MQ queue

java - 单击相应复选框时在动态网络表中查找金额总和

java - 如何用连续的数字填充数组

java - 在 JFXTreeTableView 单元格中换行文本

Java Spring MVC 模板引擎

java - Spring JPA关联实体创建相同的记录

java - 任何获取 HTTP GET、POST、PUT、DELETE 常量的方法?

java - 如何从Activemq向消费者推送消息