gpt4 book ai didi

spring - @JmsListener 用于发布-订阅主题

转载 作者:IT老高 更新时间:2023-10-28 13:44:56 27 4
gpt4 key购买 nike

我正在尝试基于@JmsListener 注释创建发布-订阅示例:https://github.com/lkrnac/book-eiws-code-samples/tree/master/05-jms/0515-publish-subscribe

相关代码片段:

@Slf4j
@SpringBootApplication
@EnableScheduling
public class JmsPublishSubscribeApplication {

public static void main(String[] args) throws InterruptedException {
SpringApplication.run(JmsPublishSubscribeApplication.class, args);
}

@Bean
public ActiveMQTopic simpleTopic() {
return new ActiveMQTopic("simpleTopic");
}

}

@Component
public class SimpleMessageListener1 {

@JmsListener(destination = "simpleTopic")
public void readMessage(String message) {
//....
}

}

@Component
public class SimpleMessageListener2 {

@JmsListener(destination = "simpleTopic")
public void readMessage(String message) {
//....
}

}

问题在于得到这种行为:

2015-05-17 20:07:04.985  INFO 22983 --- [pool-1-thread-1] n.l.b.e.chapter05.SimpleMessageSender    : Sending message: simple message
2015-05-17 20:07:05.070 INFO 22983 --- [enerContainer-1] n.l.b.e.c.JmsPublishSubscribeApplication : Message Received: simple message via listener 2
2015-05-17 20:07:05.975 INFO 22983 --- [pool-1-thread-1] n.l.b.e.chapter05.SimpleMessageSender : Sending message: simple message
2015-05-17 20:07:05.986 INFO 22983 --- [enerContainer-1] n.l.b.e.c.JmsPublishSubscribeApplication : Message Received: simple message via listener 1
2015-05-17 20:07:06.975 INFO 22983 --- [pool-1-thread-1] n.l.b.e.chapter05.SimpleMessageSender : Sending message: simple message
2015-05-17 20:07:06.987 INFO 22983 --- [enerContainer-1] n.l.b.e.c.JmsPublishSubscribeApplication : Message Received: simple message via listener 2
2015-05-17 20:07:07.975 INFO 22983 --- [pool-1-thread-1] n.l.b.e.chapter05.SimpleMessageSender : Sending message: simple message
2015-05-17 20:07:07.994 INFO 22983 --- [enerContainer-1] n.l.b.e.c.JmsPublishSubscribeApplication : Message Received: simple message via listener 1

但是根据主题的定义,每个消息都应该被两个监听器消费。我错过了什么?

最佳答案

当使用 @JmsListener 时,它使用扩展 JmsDestinationAccessorDefaultMessageListenerContainer默认情况下,将 pubSubDomain 设置为 false。当此属性为 false 时,它​​正在对队列进行操作。如果要使用主题,则必须将此属性值设置为 true

当您使用 Spring Boot您可以通过将 spring.jms.pub-sub-domain 属性添加到 application.properties 并将其设置为 true< 来轻松将此属性设置为 true/

spring.jms.pub-sub-domain=true

使用 @JmsListener 时它正在寻找一个名为 bean 的 jmsListenerContainerFactory ,如果它不可用,则需要一个默认值。您还可以包含自己的 bean 并以编程方式将此属性设置为 true

@Bean
public DefaultMessageListenerContainer jmsListenerContainerFactory() {
DefaultJmsListenerContainerFactory dmlc = new DefaultJmsListenerContainerFactory();
dmlc.setPubSubDomain(true);
// Other configuration here
return dmlc;
}

这当然也可以工作,但工作量更大,更多信息可以在 @EnableJms annotation 的文档中找到。 .

关于spring - @JmsListener 用于发布-订阅主题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30291067/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com