SpringBoot整合ActiveMQ[超详细版]

逃离我推掉我的手 2023-10-15 17:52 182阅读 0赞

目录

简介

什么是ActiveMQ

JMS的概念

linux中安装并运行ActiveMQ

进入activemq管理页面

SpringBoot整合ActiveMQ-队列模式

生产者

pom依赖

配置yml

启动类

配置通道

测试发送信息进入通道

接受者

pom依赖

yml配置

启动类

接受mq类

SpringBoot整合ActiveMQ-主题模式

生产者

创建主题通道

测试发信息进入主题

接受者

yaml

接收类


简介

什么是ActiveMQ

消息队列(Message Queue)是一种进程间或者线程间的异步通信方式。使用消息队列,消息生产者会将消息保存在消息队列中,知道消息消费者来取走它。实现服务的解耦合,并提高系统的可靠性和扩展性。
目前常用的开源消息队列有很多,RabbitMQ、ActiveMQ、Redis、Kafka等,也就是常说的消息中间件。
本篇文章以Apache ActiveMQ为例,实战整合ActiveMQ的队列模式和广播模式两种以及兼容两种的实战。

JMS的概念

JMS

JMS即Java消息服务应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数中间件提供商都对JMS提供支持。JMS与ActiveMQ的关系类似于JDBC与JDBC驱动的关系。。

JMS包括两种消息模型:点对点、发布者/订阅者;
点对点式: – 消息发送者发送消息,消息代理将其放入一个队列中,消息接收者从队列中获取消息内容, 消息读取后被移出队列 – 消息只有唯一的发送者和接受者,但并不是说只能有一个接收者
发布订阅式: – 发送者(发布者)发送消息到主题,多个接收者(订阅者)监听(订阅)这个主题,那么 就会在消息到达时同时收到消息

JMS是定义了统一的接口,来对消息操作进行统一;
JMS限定了必须使用Java语言;
JMS规定了两种消息模型;而AMQP的消息模型更加丰富。

linux中安装并运行ActiveMQ

链接:https://pan.baidu.com/s/1tZSs6iefzKVLHSwxihQ3Nw?pwd=1234
提取码:1234

  1. //复制到虚拟机,解压出来
  2. tar -zxvf apache-activemq-5.14.5-bin.tar.gz
  3. //解压完成之后,进入文件/bin目录下
  4. cd apache-activemq-5.14.5/bin
  5. //启动activemq
  6. ./activemq start

启动成功e75d650e416a4f4fb7aae735111ae028.png

注意:

关闭防火墙

进入activemq管理页面

http://自己的IP地址:8161/ 即可进入ActiveMQ管理页面

b106fd2681f74ea2b19e2c012ebd59df.png

输入账号密码均为:admin

7767acf45f1b43cbbcc86799d85ae155.png

7916e06276be43a29e261343c7abc37f.png

SpringBoot整合ActiveMQ-队列模式

springboot版本:2.3.4.RELEASE

注意:

队列模式:

队列模式可以理解为先进先出模式,生产者发布完消息后存入队列中一直等监听者接收。监听者上线就会收到队列中的信息!但是只要收到,那么队列中的信息就会消失。

生产者

pom依赖

  1. <!-- ActiveMQ -->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-activemq</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-test</artifactId>
  9. <scope>test</scope>
  10. </dependency>

配置yml

  1. spring:
  2. activemq:
  3. broker-url: tcp://自己的activemq服务器ip:61616
  4. packages:
  5. #配置信任所有的包,这个配置为了支持发送对象消息
  6. trust-all: true
  7. user: admin
  8. password: admin

启动类

  1. @SpringBootApplication
  2. @EnableJms #开启JMS
  3. public class SpringBootThree {
  4. public static void main(String[] args) {
  5. SpringApplication.run(SpringBootThree.class,args);
  6. }
  7. }

配置通道

  1. /**
  2. * 专门配置mq通道的配置类
  3. */
  4. @Configuration
  5. public class QueueConfig {
  6. @Bean(name = "queueName")
  7. Queue queueName(){
  8. return new ActiveMQQueue("test_queue");
  9. }
  10. }

测试发送信息进入通道

  1. @SpringBootTest
  2. public class RedisTest {
  3. @Autowired
  4. JmsMessagingTemplate jmsMessagingTemplate;
  5. @Autowired
  6. Queue queueName;
  7. @Test
  8. public void test5(){
  9. String message="我是发送消息的人,听得到吗";
  10. jmsMessagingTemplate.convertAndSend(queueName, message);
  11. }
  12. }

接受者

pom依赖

  1. <!-- ActiveMQ -->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-activemq</artifactId>
  5. </dependency>

yml配置

  1. server:
  2. port: 10006
  3. spring:
  4. activemq:
  5. broker-url: tcp://自己的activemq服务器的ip:61616
  6. packages:
  7. #配置信任所有的包,这个配置为了支持发送对象消息
  8. trust-all: true
  9. user: admin
  10. password: admin

启动类

  1. @SpringBootApplication
  2. public class ConsumerMain10006 {
  3. public static void main(String[] args) {
  4. SpringApplication.run(ConsumerMain10006.class,args);
  5. }
  6. }

接受mq类

  1. /**
  2. * 用于监听MQ
  3. */
  4. @Component
  5. public class MQConfig {
  6. @JmsListener(destination = "test_queue")
  7. public void onMessage(String message){
  8. System.out.print(message)
  9. //获取到消息后可以干一些事情
  10. }
  11. }

SpringBoot整合ActiveMQ-主题模式

注意:

主题模式与队列模式的区别:

1、主题模式发布的消息,可以分发给所有订阅者

2、主题模式为发布订阅模式,只有订阅者(监听的类)在线时,才能接受到消息,如果中途连接进来,之前的消息是接收不到的,只能接收之后的信息!

生产者

生产者的pom、yml、启动类和队列模式一样

创建主题通道

  1. /**
  2. * 专门配置mq通道的配置类
  3. */
  4. @Configuration
  5. public class QueueConfig {
  6. @Bean(name = "queueName")
  7. Queue queueName(){
  8. return new ActiveMQQueue("test_queue");
  9. }
  10. //主题(发布\订阅模式)通道
  11. @Bean(name="queueFind")
  12. Topic queueFind(){
  13. return new ActiveMQTopic("cctv");
  14. }
  15. }

测试发信息进入主题

  1. @SpringBootTest
  2. public class RedisTest {
  3. @Autowired
  4. JmsMessagingTemplate jmsMessagingTemplate;
  5. @Autowired
  6. Queue queueName;
  7. @Autowired
  8. Topic queueFind;
  9. @Test
  10. public void test5(){
  11. String message="我是发送消息的人,你接受我就没了";
  12. jmsMessagingTemplate.convertAndSend(queueName, message);
  13. }
  14. @Test
  15. public void test6(){
  16. String message="我是主题可以发布所有监听我的人,但是我发布你必须在线";
  17. jmsMessagingTemplate.convertAndSend(queueFind, message);
  18. }
  19. }

接受者

pom与启动类队列一样

yaml

  1. spring:
  2. activemq:
  3. broker-url: tcp://自己acvtvemq服务器的ip:61616
  4. packages:
  5. #配置信任所有的包,这个配置为了支持发送对象消息
  6. trust-all: true
  7. user: admin
  8. password: admin
  9. #开启主题策略,默认是关闭 开启主题模式
  10. jms:
  11. pub-sub-domain: true

接收类

  1. /**
  2. * 用于监听MQ
  3. */
  4. @Component
  5. public class MQConfig {
  6. @JmsListener(destination = "test_queue")
  7. public void onMessage(String message){
  8. System.out.print(message)
  9. //获取到消息后可以干一些事情
  10. }
  11. @JmsListener(destination = "cctv")
  12. public void cctv(String message){
  13. System.out.print(message)
  14. //获取到消息后可以干一些事情
  15. }
  16. }

发表评论

表情:
评论列表 (有 0 条评论,182人围观)

还没有评论,来说两句吧...

相关阅读