前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot使用ActiveMq同时支持点对点推送和发布订阅

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

作者头像
憧憬博客
发布2020-07-21 15:08:38
1.1K0
发布2020-07-21 15:08:38
举报
文章被收录于专栏:憧憬博客分享

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

先来配置一下点对面的。

  • application.properties 增加配置
代码语言:javascript
复制
#default point to point 开启发布订阅
spring.jms.pub-sub-domain=true
  • xxApplication.java
代码语言:javascript
复制
// 将对象交给spring来管理
@Bean
    public Topic topic(){
        return new ActiveMQTopic("common.topic");
    }
  • inteface ProducerService.java 增加
代码语言:javascript
复制
/**
 * 发布消息
 * @param message
 */
public void publish(final String message);
  • ProducerServiceImpl.java 增加
代码语言:javascript
复制
@Autowired
private Topic topic;

@Override
public void publish(String message) {
    jmsMessagingTemplate.convertAndSend(topic, message);
}
  • 订阅者 CommonTopicSub.java
代码语言:javascript
复制
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
代码语言:javascript
复制
@GetMapping("publish")
public Object publish(String msg) {
    producerService.publish(msg);
    return JsonUtils.buildSuccess("ok");
}
  • 效果
订阅效果
订阅效果

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

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

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

  • 修改 CommonTopicSub.java
代码语言:javascript
复制
/**
 * @ JmsListener如果不指定独立的containerFactory的话是只能消费queue消息 是订阅不到消息的
 * @param text
 */
@JmsListener(destination = "common.topic", containerFactory="jmsListenerContainerTopic")
public void receiveTopic1(String text) {
    System.out.println("common.topic1 接受到的消息 ====" + text);
}
  • xxApplication.java 增加
代码语言:javascript
复制
@Bean
public JmsListenerContainerFactory<?> jmsListenerContainerTopic() {
    DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory();
    bean.setPubSubDomain(true);
    bean.setConnectionFactory(connectionFactory()); // 创建连接的方法 如果不知道看上篇快速入门文章
    return bean;
}
  • 最终效果
点对点、点对面效果
点对点、点对面效果
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档