当前位置: 首页 > 编程笔记 >

详解Springboot整合ActiveMQ(Queue和Topic两种模式)

曹渝
2023-03-14
本文向大家介绍详解Springboot整合ActiveMQ(Queue和Topic两种模式),包括了详解Springboot整合ActiveMQ(Queue和Topic两种模式)的使用技巧和注意事项,需要的朋友参考一下

写在前面: 从2018年底开始学习SpringBoot,也用SpringBoot写过一些项目。这里对学习Springboot的一些知识总结记录一下。如果你也在学习SpringBoot,可以关注我,一起学习,一起进步。

ActiveMQ简介

1、ActiveMQ简介

Apache ActiveMQ是Apache软件基金会所研发的开放源代码消息中间件;由于ActiveMQ是一个纯Java程序,因此只需要操作系统支持Java虚拟机,ActiveMQ便可执行。

2、ActiveMQ下载

下载地址:http://activemq.apache.org/components/classic/download/


下载完成后解压双击activemq.bat文件打开(不用安装,直接使用),目录和打开后效果如下:



运行后,浏览器访问http://localhost:8161/地址进入一下界面。


点击Manage ActiveMQ broker登录到ActiveMQ管理页面,默认账号和密码都是admin。管理页面如下:

SpringBoot整合ActiveMQ

1、新建SpringBoot项目

新建Springboot项目,添加对应的依赖。项目完整的pom.xml文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.2.5.RELEASE</version>
  <relativePath/> <!-- lookup parent from repository -->
 </parent>
 <groupId>com.mcy</groupId>
 <artifactId>springboot-mq</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <name>springboot-mq</name>
 <description>Demo project for Spring Boot</description>

 <properties>
  <java.version>1.8</java.version>
 </properties>

 <dependencies>
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
  </dependency>

  <!--Activemq依赖-->
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-activemq</artifactId>
  </dependency>

  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-test</artifactId>
   <scope>test</scope>
   <exclusions>
    <exclusion>
     <groupId>org.junit.vintage</groupId>
     <artifactId>junit-vintage-engine</artifactId>
    </exclusion>
   </exclusions>
  </dependency>
 </dependencies>

 <build>
  <plugins>
   <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
   </plugin>
  </plugins>
 </build>
</project>

2、项目结构

3、相关配置信息

在application.properties类中添加ActiveMQ相关的配置信息

server.port=8080
server.servlet.context-path=/mq

#MQ服务器地址
spring.activemq.broker-url=tcp://localhost:61616
#用户名
spring.activemq.user=admin
#密码
spring.html" target="_blank">activemq.password=admin
#设置是Queue队列还是Topic,false为Queue,true为Topic,默认false-Queue
spring.jms.pub-sub-domain=false
#spring.jms.pub-sub-domain=true

#变量,定义队列和topic的名称
myqueue: activemq-queue
mytopic: activemq-topic

4、ActiveMQ配置类

ActiveMQ配置类ConfigBean,配置了Queue队列和topic两种模式,代码如下:

import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTopic;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.stereotype.Component;
import javax.jms.Topic;

/**
 1. MQ配置类
 */
@Component
@EnableJms
public class ConfigBean {
 @Value("${myqueue}")
 private String myQueue;
 @Value("${mytopic}")
 private String topicName;

 //队列
 @Bean
 public ActiveMQQueue queue(){
  return new ActiveMQQueue(myQueue);
 }

 //topic
 @Bean
 public Topic topic(){
  return new ActiveMQTopic(topicName);
 }
}

Queue队列模式

队列模式即点对点传输。
点对点消息传递域的特点如下:

每个消息只能有一个消费者,类似于1对1的关系。好比个人快递自己领自己的。

消息的生产者和消费者之间没有时间上的相关性。无论消费者在生产者发送消息的时候是否处于运行状态,消费者都可以提取消息。好比我们的发送短信,发送者发送后不见得接收者会即收即看。

消息被消费后队列中不会再存储,所以消费者不会消费到已经被消费掉的消息。

1、队列生产者

QueueProducerController类为队列生产者控制器,主要向消息队列中发送消息。代码如下:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.jms.Queue;

/*
 * 队列消息生产者
 */
@RestController
public class QueueProducerController {
 @Autowired
 private JmsMessagingTemplate jmsMessagingTemplate;

 @Autowired
 private Queue queue;

 /*
  * 消息生产者
  */
 @RequestMapping("/sendmsg")
 public void sendmsg(String msg) {
  System.out.println("发送消息到队列:" + msg);
  // 指定消息发送的目的地及内容
  this.jmsMessagingTemplate.convertAndSend(this.queue, msg);
 }
}

2、队列消费者

QueueConsumerController类为队列消费者控制器,具体代码如下:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.web.bind.annotation.RestController;

/*
 1. 队列queue消费者控制器
 */
@RestController
public class QueueConsumerController {
 /*
  * 消费者接收消息
  */
 @JmsListener(destination="${myqueue}")
 public void readActiveQueue(String message) {
  System.out.println("接受到:" + message);
 }
}

3、测试效果

运行项目在浏览器中访问http://localhost:8080/mq/sendmsg?msg=123。向消息队列中发送123。控制台输出效果:


ActiveMQ控制台显示:

  • Number Of Pending Messages:消息队列中待处理的消息
  • Number Of Consumers:消费者的数量
  • Messages Enqueued:累计进入过消息队列的总量
  • Messages Dequeued:累计消费过的消息总量

【注】队列模式时,配置文件application.properties中spring.jms.pub-sub-domain属性必须设置为false。

Topic模式

topic模式基于发布/订阅模式的传输。
基于发布/订阅模式的传输的特点如下:

  • 生产者将消息发布到topic中,每个消息可以有多个消费者,属于1:N的关系;
  • 生产者和消费者之间有时间上的相关性。订阅某一个主题的消费者只能消费自它订阅之后发布的消息。
  • 生产者生产时,topic不保存消息它是无状态的不落地,假如无人订阅就去生产,那就是一条废消息。

1、topic生产者

TopicProducerController类为topic生产者控制器,主要向消息队列中发送消息。代码如下:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.jms.Queue;
import javax.jms.Topic;

/*
* topic消息生产者
*/
@RestController
public class TopicProducerController {
 @Autowired
 private JmsMessagingTemplate jmsMessagingTemplate;

 @Autowired
 private Topic topic;

 /*
 * 消息生产者
 */
 @RequestMapping("/topicsendmsg")
 public void sendmsg(String msg) {
  System.out.println("发送消息到MQ:" + msg);
  // 指定消息发送的目的地及内容
  this.jmsMessagingTemplate.convertAndSend(this.topic, msg);
 }
}

2、topic消费者

TopicConsumerController类为topic消费者控制器,其中写了两个消费者方法,可以理解为有两个用户订阅。具体代码如下:

import org.springframework.jms.annotation.JmsListener;
import org.springframework.web.bind.annotation.RestController;

/*
 1. topic消费者控制器
 */
@RestController
public class TopicConsumerController {
 /*
  * 消费者接收消息
  */
 @JmsListener(destination="${mytopic}")
 public void readActiveQueue(String message) {
  System.out.println("接受到:" + message);
 }

 @JmsListener(destination="${mytopic}")
 public void readActiveQueue1(String message) {
  System.out.println("接受到:" + message);
 }
}

3、测试效果

运行项目在浏览器中访问http://localhost:8080/mq/topicsendmsg?msg=123。向消息队列中发送123。控制台输出效果(有两个消费者方法):


ActiveMQ控制台显示:

  • Number Of Consumers:消费者的数量
  • Messages Enqueued:累计进入过消息队列的总量
  • Messages Dequeued:累计消费过的消息总量

【注】Topic模式时,配置文件application.properties中spring.jms.pub-sub-domain属性必须设置为true。

到此这篇关于详解Springboot整合ActiveMQ(Queue和Topic两种模式)的文章就介绍到这了,更多相关Springboot整合ActiveMQ内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!

 类似资料:
  • 本文向大家介绍SpringBoot整合ActiveMQ过程解析,包括了SpringBoot整合ActiveMQ过程解析的使用技巧和注意事项,需要的朋友参考一下 目录结构 引入 maven依赖 引入 application.yml配置 创建QueueConfig 创建生产者: 创建消费者的application.yml 创建消费者: 结果显示: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希

  • 本文向大家介绍详解springboot整合mongodb,包括了详解springboot整合mongodb的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍springboot如何整合MongoDB。 准备工作 安装 MongoDB jdk 1.8 maven 3.0 idea 环境依赖 在pom文件引入spring-boot-starter-data-mongodb依赖: 数据源配置 如

  • 本文向大家介绍springboot整合freemarker详解,包括了springboot整合freemarker详解的使用技巧和注意事项,需要的朋友参考一下 前提: 开发工具:idea 框架:spring boot、maven 1、pom文件添加依赖 2、新建spring web项目,会自动生成application.properties. 使用application.properties配置文

  • TopicQueue是为了保证Queue中Message的局部有序性(同一Topic内有序)而引入的概念。 用户在创建Queue时,将Queue的topicQueue属性设置为True,得到的Queue即是TopicQueue。 之后,向TopicQueue中发送Message时,用户可以为Message设置String类型的Topic属性(也可以不指定,即Topic为空)。 EMQ将保证用户接收

  • 本文向大家介绍详解SpringBoot整合MyBatis详细教程,包括了详解SpringBoot整合MyBatis详细教程的使用技巧和注意事项,需要的朋友参考一下 1. 导入依赖 首先新建一个springboot项目,勾选组件时勾选Spring Web、JDBC API、MySQL Driver 然后导入以下整合依赖 2. 连接数据库 数据库代码: 然后IDEA连接数据库 打开我们创建的数据库sp

  • 本文向大家介绍SpringBoot整合Shiro的代码详解,包括了SpringBoot整合Shiro的代码详解的使用技巧和注意事项,需要的朋友参考一下 shiro是一个权限框架,具体的使用可以查看其官网 http://shiro.apache.org/  它提供了很方便的权限认证和登录的功能.   而springboot作为一个开源框架,必然提供了和shiro整合的功能!接下来就用springbo