SpringBoot使用ActiveMq同时支持点对点推送和发布订阅

简介: SpringBoot使用ActiveMq同时支持点对点推送和发布订阅

SpringBoot中使用ActiveMq默认是只能点对点推送, ActiveMq还有一种方式就是发布订阅, 一个发布者, 多个订阅者, 形成一个点对面

先来配置一下点对面的。

  • application.properties 增加配置
#default point to point 开启发布订阅
spring.jms.pub-sub-domain=true
  • xxApplication.java
// 将对象交给spring来管理
@Bean
    public Topic topic(){
        return new ActiveMQTopic("common.topic");
    }
  • inteface ProducerService.java 增加
/**
 * 发布消息
 * @param message
 */
public void publish(final String message);
  • ProducerServiceImpl.java 增加
@Autowired
private Topic topic;
@Override
public void publish(String message) {
    jmsMessagingTemplate.convertAndSend(topic, message);
}
  • 订阅者 CommonTopicSub.java
package com.example.demo.jms;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;
@Component
public class CommonTopicSub {
    @JmsListener(destination = "common.topic")
    public void receiveTopic1(String text) {
        System.out.println("common.topic1 接受到的消息 ====" + text);
    }
    @JmsListener(destination = "common.topic")
    public void receiveTopic2(String text) {
        System.out.println("common.topic2 接受到的消息 ====" + text);
    }
}
  • controller
@GetMapping("publish")
public Object publish(String msg) {
    producerService.publish(msg);
    return JsonUtils.buildSuccess("ok");
}
  • 效果

这样就完成了我们的发布订阅, 但是测试的时候发现 点对点推送不好用, 消息开始堆积, 我们需要让它同时支持两种

默认消费者并不会消费订阅发布类型的消息,这是由于springboot默认采用的是p2p模式进行消息的监听

在配置文件里面,注释掉 #spring.jms.pub-sub-domain=true

  • 修改 CommonTopicSub.java
/**
 * @ JmsListener如果不指定独立的containerFactory的话是只能消费queue消息 是订阅不到消息的
 * @param text
 */
@JmsListener(destination = "common.topic", containerFactory="jmsListenerContainerTopic")
public void receiveTopic1(String text) {
    System.out.println("common.topic1 接受到的消息 ====" + text);
}
  • xxApplication.java 增加
@Bean
public JmsListenerContainerFactory<?> jmsListenerContainerTopic() {
    DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory();
    bean.setPubSubDomain(true);
    bean.setConnectionFactory(connectionFactory()); // 创建连接的方法 如果不知道看上篇快速入门文章
    return bean;
}
  • 最终效果

目录
相关文章
|
消息中间件 Java
springboot整合ActiveMQ(点对点+发布订阅)
springboot整合ActiveMQ(点对点+发布订阅)
|
7月前
|
消息中间件 Java
SpringBoot使用ActiveMq同时支持点对点推送和发布订阅
SpringBoot使用ActiveMq同时支持点对点推送和发布订阅
46 0
|
7月前
|
消息中间件 Java Kafka
SpringBoot整合 ActiveMQ快速入门 实现点对点推送
SpringBoot整合 ActiveMQ快速入门 实现点对点推送
74 0
|
消息中间件 Java Kafka
SpringBoot整合 ActiveMQ快速入门 实现点对点推送
SpringBoot整合 ActiveMQ快速入门 实现点对点推送
179 0
|
消息中间件 网络协议 Java
springboot整合jms之activemq
springboot整合jms之activemq
168 0
springboot整合jms之activemq
|
消息中间件 存储 安全
干货|SpringBoot JMS(ActiveMQ)API实践应用详解
Active是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。AC-tiveMQ使用Apache提供的...
316 0
|
消息中间件 Java 网络协议
SpringBoot 整合 JMS(ActiveMQ)
SpringBoot整合JMS(ActiveMQ) 消息队列(Message Queue)是一种进程间或线程间的异步通信方式,使用消息队列消息生产者在消息产生后,会将消息保存在消息队列中直到消费者来取走它,即消息的发送者和接收者不需要与消息队列交互。
1387 0
|
消息中间件 Java 网络协议
SpringBoot整合ActiveMQ实现Email发送:专业负责MQ20年~
javax.mail 依赖__javax.mail + mq javax.mail mail 1.
2549 0
|
消息中间件 Java Apache
SpringBoot整合ActiveMQ:专业负责MQ20年~
ACTIVEMQ ActiveMQ 下载MQ后启动一下(Windows版本) #启动信息 ... jvm 1 | INFO | Listening for connections at ws://JackWen:61614?maximumConnections=1000&wireFormat.
1491 0
|
消息中间件 缓存 安全
SpringBoot与JMS集成(中间件为ActiveMQ)
Apache ActiveMQ是最受欢迎和强有力的开源消息和集成模式服务器,支持许多跨语言客户端和协议,便利使用企业集成模式还有许多先进的特性。