springboot整合activemq,实现queue,topic同时支持

  1、JMS中定义了两种消息模型:点对点(point to point, queue)发布/订阅(publish/subscribe,topic),区别如下:

    (1)queue(点对点):不可重复消费。消息生产者发送消息到queue,然后消息消费者从中取出并消费消息;消息消费后将不再存储在queue中;queue支持存在多个消费者,但是对于一条消息来说,只能有一个消费者进行消费;当消息没有消费者的时候,消息将一直保存,知道有消费者消费。

    (2)topic(发布/订阅):可以重复消费。消息生产者发布消息到topic,同时有多个订阅者订阅该消息;发布到topic中的消息会被所有的订阅者消费;当生产者发布消息,不管是否有订阅者,消息都不会保存。

  2、之前的笔记中对p2p的消息发布进行了测试,下面使用发布/订阅模式来进行消息发布与消费,首先要增加配置,开启发布/订阅模式:spring.jms.pub-sub-domain=true

  3、登陆activemq控制台,新建topic:test.topic

  4、在Application中新增代码,方便注入topic

  @Bean
public Topic topic() {
return new ActiveMQTopic("test.topic");
}

       5、添加消息发布接口及实现

/**
*
*/
package com.zc.app.test.service; import javax.jms.Destination; /**
* topic 消息发布接口
*
*/
public interface PublishService { public void publish(String msg) ; public void publish(Destination des,String msg);
}

PublishService

/**
*
*/
package com.zc.app.test.service.impl; import javax.jms.Destination;
import javax.jms.Topic; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Service; import com.zc.app.test.service.PublishService; /**
* 消息发布实现
*
*/
@Service
public class PublishServiceImpl implements PublishService{ @Autowired
private Topic topic; @Autowired
private JmsMessagingTemplate jms; //发送消息
@Override
public void publish(String msg) {
jms.convertAndSend(topic, msg); }
//发送消息到指定的topic
@Override
public void publish(Destination des, String msg) {
jms.convertAndSend(des, msg);
} }

PublishServiceImpl

    6、增加消息订阅者

/**
*
*/
package com.zc.app.test.jms; import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component; /**
* 消息消费者
*
*/
@Component
public class TopicSubscribe { @JmsListener(destination="test.topic")
public void ubscribe1(String msg) {
System.out.println("消息订阅者1:"+msg);
} @JmsListener(destination="test.topic")
public void ubscribe2(String msg) {
System.out.println("消息订阅者2:"+msg);
} @JmsListener(destination="test.topic")
public void subscribe3(String msg) {
System.out.println("消息订阅者3:"+msg);
}
}

TopicSubscribe

    7、contoller中增加发送消息接口

   @Autowired
private PublishService publishService; @GetMapping("topic")
public String topic(String msg) {
publishService.publish(msg);
return "send topic msg";
}

    8、访问http://localhost:8080/msg/topic?msg=12468487,控制台输出,说明订阅成功

   9、这时发现向queue中写入数据后,消息消费者没有输出了,这时因为activemq默认只支持点对点模式,更改配置文件后又仅支持发布/订阅模式。要同时支持两种模式,就需要为topic定义独立的JmsListenerContainer

  10、在Application中增加代码

  @Bean
public JmsListenerContainerFactory<?> jmsListenerContainerTopic() {
DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory();
bean.setPubSubDomain(true);
bean.setConnectionFactory(new ActiveMQConnectionFactory());
return bean;
}

  11、在TopicSubscribe的@JmsListener注解中增加containerFactory设置,去掉配置文件中的spring.jms.pub-sub-domain=true,这时就可以实现两种模式同时使用了,我们更改一下TopicSubscribe

/**
*
*/
package com.zc.app.test.jms; import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component; /**
* 订阅者
*
*/
@Component
public class TopicSubscribe { @JmsListener(destination="test.topic",containerFactory="jmsListenerContainerTopic")
public void ubscribe1(String msg) {
System.out.println("消息订阅者1:"+msg);
} @JmsListener(destination="test.topic",containerFactory="jmsListenerContainerTopic")
public void ubscribe2(String msg) {
System.out.println("消息订阅者2:"+msg);
} @JmsListener(destination="test.topic")
public void subscribe3(String msg) {
System.out.println("消息订阅者3:"+msg);
}
}

TopicSubscribe

   12、再次访问http://localhost:8080/msg/topic?msg=12468487,发现只有订阅者1、2输出了消息,同时queue的消费者也可以收到消息了。

springboot 学习笔记(八)的更多相关文章

  1. SpringBoot学习笔记

    SpringBoot个人感觉比SpringMVC还要好用的一个框架,很多注解配置可以非常灵活的在代码中运用起来: springBoot学习笔记: .一.aop: 新建一个类HttpAspect,类上添 ...

  2. Learning ROS forRobotics Programming Second Edition学习笔记(八)indigo rviz gazebo

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...

  3. Springboot学习笔记(六)-配置化注入

    前言 前面写过一个Springboot学习笔记(一)-线程池的简化及使用,发现有个缺陷,打个比方,我这个线程池写在一个公用服务中,各项参数都定死了,现在有两个服务要调用它,一个服务的线程数通常很多,而 ...

  4. python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑

    python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑 许多人在安装Python第三方库的时候, 经常会为一个问题困扰:到底应该下载什么格式的文件?当我们点开下载页时, 一般 ...

  5. Go语言学习笔记八: 数组

    Go语言学习笔记八: 数组 数组地球人都知道.所以只说说Go语言的特殊(奇葩)写法. 我一直在想一个人参与了两种语言的设计,但是最后两种语言的语法差异这么大.这是自己否定自己么,为什么不与之前统一一下 ...

  6. SpringBoot学习笔记(14):使用SpringBootAdmin管理监控你的应用

    SpringBoot学习笔记(14):使用SpringBootAdmin管理监控你的应用 Spring Boot Admin是一个管理和监控Spring Boot应用程序的应用程序.本文参考文档: 官 ...

  7. SpringBoot学习笔记(3):静态资源处理

    SpringBoot学习笔记(3):静态资源处理 在web开发中,静态资源的访问是必不可少的,如:Html.图片.js.css 等资源的访问. Spring Boot 对静态资源访问提供了很好的支持, ...

  8. SpringBoot学习笔记(2):引入Spring Security

    SpringBoot学习笔记(2):用Spring Security来保护你的应用 快速开始 本指南将引导您完成使用受Spring Security保护的资源创建简单Web应用程序的过程. 参考资料: ...

  9. SpringBoot学习笔记(7):Druid使用心得

    SpringBoot学习笔记(7):Druid使用心得 快速开始 添加依赖 <dependency> <groupId>com.alibaba</groupId> ...

  10. SpringBoot学习笔记(4):与前端交互的日期格式

    SpringBoot学习笔记(4):与前端交互的日期格式 后端模型Date字段解析String 我们从前端传回来表单的数据,当涉及时间.日期等值时,后端的模型需将其转换为对应的Date类型等. 我们可 ...

随机推荐

  1. 设置win7资源管理器启动时的默认位置-windows-操作系统-网页教学网

    设置win7资源管理器启动时的默认位置-windows-操作系统-网页教学网 如何设置win7资源管理器启动时的默认位置?我不太习惯 Win 7 的资源管理器默认总是打开库,我还是喜欢资源管理器打开树 ...

  2. SSDB VS redis

    现在有不少团队开始使用了一个新型高效的 NoSQL数据库 - SSDB,如 京东.唱吧 …… SSDB 官网的定义 一个高性能的支持丰富数据结构的 NoSQL 数据库,用于替代 Redis 官网 ht ...

  3. JAVA基础知识总结3(面向对象)

    特点:过程其实就是函数:对象是将函数等一些内容进行了封装 1:将复杂的事情简单化. 2:面向对象将以前的过程中的执行者,变成了指挥者. 3:面向对象这种思想是符合现在人们思考习惯的一种思想. 匿名对象 ...

  4. CentOS 7 安装以及配置 VNC

    一.安装VNC : yum install tigervnc  tigervnc-server  -y 二.启动vnc并设置密码: vncserver :1 三.将服务添加到防火墙: firewall ...

  5. makefile基本语法

    多文件编程的小例子功能:在main.c里面调用其他两个源文件里面的函数,然后输出字符串. 1.main.c    #include"mytool1.h"#include" ...

  6. 第四篇 express 安装esasticsearch

    1.首先,我们创建一个Express应用程序!我将使用express.js生成器. npm install -g express-generator express ./autocompleter c ...

  7. mysql修改查询出来的时间格式

    var d = new Date(rss.createtime); let youWant = d.getFullYear() + ) + '-' + d.getDate() + ' ' + d.ge ...

  8. nodejs 操作文件系统读取写入文件

    我们通过fs这个模块来对文件系统进行操作,对于文件系统操作一般都有同步.异步方法,两者区别,同步等有返回结果时候,在继续执行后面的代码,异步是不等返回结果,直接执行后面的代码,待有返回结果时候,通过回 ...

  9. Hive之数据查询

    Hive之数据查询 发布于:2013 年 10 月 11 日 由 Aaron发布于: Hive 一,排序和聚合 对于排序有两种方式,一种是order by 一种是sort by order by 会对 ...

  10. (转自精通Python设计模式)Python设计模式之创建型模式——2.建造者模式

    建造者模式将一个复杂对象的构造过程与其表现分离,这样,同一个构造过程可用于创建多个不同的表现. 我们来看个实际的例子,假设我们想要创建一个HMTL页面生成器,HTML页面的基本结构(构造组件)通常是一 ...