热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

详解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文件如下:

<&#63;xml version="1.0" encoding="UTF-8"&#63;>

 4.0.0
 
  org.springframework.boot
  spring-boot-starter-parent
  2.2.5.RELEASE
   
 
 com.mcy
 springboot-mq
 0.0.1-SNAPSHOT
 springboot-mq
 Demo project for Spring Boot

 
  1.8
 

 
  
   org.springframework.boot
   spring-boot-starter-web
  

  
  
   org.springframework.boot
   spring-boot-starter-activemq
  

  
   org.springframework.boot
   spring-boot-starter-test
   test
   
    
     org.junit.vintage
     junit-vintage-engine
    
   
  
 

 
  
   
    org.springframework.boot
    spring-boot-maven-plugin
   
  
 

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.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&#63;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&#63;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内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • 在搭建Hadoop集群以处理大规模数据存储和频繁读取需求的过程中,经常会遇到各种配置难题。本文总结了作者在实际部署中遇到的典型问题,并提供了详细的解决方案,帮助读者避免常见的配置陷阱。通过这些经验分享,希望读者能够更加顺利地完成Hadoop集群的搭建和配置。 ... [详细]
  • Java Web开发中的JSP:三大指令、九大隐式对象与动作标签详解
    在Java Web开发中,JSP(Java Server Pages)是一种重要的技术,用于构建动态网页。本文详细介绍了JSP的三大指令、九大隐式对象以及动作标签。三大指令包括页面指令、包含指令和标签库指令,它们分别用于设置页面属性、引入其他文件和定义自定义标签。九大隐式对象则涵盖了请求、响应、会话、应用上下文等关键组件,为开发者提供了便捷的操作接口。动作标签则通过预定义的动作来简化页面逻辑,提高开发效率。这些内容对于理解和掌握JSP技术具有重要意义。 ... [详细]
  • 利用Apache构建高效稳定的Web服务器环境
    本文详细介绍了如何利用Apache构建高效稳定的Web服务器环境。首先,概述了Apache服务器的基本概念及其安装步骤,并深入探讨了相关配置文件的设置方法。接着,通过具体的实验环境示例,展示了服务端(域名:zhangpp63.cn,IP地址:192.168.1.63)和客户端的配置过程,确保读者能够全面理解并实际应用这些技术。此外,还提供了一些优化建议,以提高服务器的性能和稳定性。 ... [详细]
  • 在尝试为 Unity 编译一个简单的 Java 库时,运行 `ant jar` 命令后遇到了 Java I/O 异常。具体错误信息为“无法启动程序 ${aAPT},错误代码 2”,这通常表示指定的文件或目录不存在。此问题可能是由于环境配置不正确或路径设置有误导致的。建议检查相关路径和环境变量,确保所有依赖项都已正确安装和配置。 ... [详细]
  • JBPM 6.5 环境配置深入解析(下篇)
    本文深入探讨了JBPM 6.5 的环境配置细节,从零开始详细介绍了下载、解压后的文件结构,并结合实际操作步骤,为初学者提供了全面的配置指南。通过具体的示例和详细的解释,帮助读者快速掌握 JBPM 6.5 的安装与配置过程。 ... [详细]
  • 【Linux】CentOS 7 远程连接指南:高效安全的远程管理方法
    在 CentOS 7 中实现高效且安全的远程管理,本文详细介绍了如何检查和安装配置 OpenSSH。首先,通过 `yum list installed` 命令检查系统是否已安装 OpenSSH,若未安装,则使用 `yum install openssh-server` 进行安装。随后,配置 SSH 服务以确保其安全性和稳定性,包括修改默认端口、禁用 root 登录等关键步骤。此外,还提供了常见问题的解决方案,帮助用户顺利进行远程连接。 ... [详细]
  • 在过去,我曾使用过自建MySQL服务器中的MyISAM和InnoDB存储引擎(也曾尝试过Memory引擎)。今年初,我开始转向阿里云的关系型数据库服务,并深入研究了其高效的压缩存储引擎TokuDB。TokuDB在数据压缩和处理大规模数据集方面表现出色,显著提升了存储效率和查询性能。通过实际应用,我发现TokuDB不仅能够有效减少存储成本,还能显著提高数据处理速度,特别适用于高并发和大数据量的场景。 ... [详细]
  • 在CentOS 7上部署WebRTC网关Janus
    在CentOS 7上部署WebRTC网关Janus ... [详细]
  • 开发笔记:深入解析Android自定义控件——Button的72种变形技巧
    开发笔记:深入解析Android自定义控件——Button的72种变形技巧 ... [详细]
  • Go 项目中数据库配置文件的优化与应用 ... [详细]
  • Hadoop 2.6 主要由 HDFS 和 YARN 两大部分组成,其中 YARN 包含了运行在 ResourceManager 的 JVM 中的组件以及在 NodeManager 中运行的部分。本文深入探讨了 Hadoop 2.6 日志文件的解析方法,并详细介绍了 MapReduce 日志管理的最佳实践,旨在帮助用户更好地理解和优化日志处理流程,提高系统运维效率。 ... [详细]
  • 手机号码归属地查询服务由 WebXml.com.cn 提供,通过其 WEB 服务接口(http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx)实现。该服务能够准确解析国内手机号码的归属地信息,适用于多种应用场景,如用户身份验证、市场分析等。 ... [详细]
  • 《精通 jQuery》第六章:深入解析与实战应用
    《精通 jQuery》第六章:深入解析与实战应用本章详细探讨了 Ajax 技术的核心机制及其实际应用。Ajax 通过 XMLHttpRequest 对象实现客户端与服务器之间的异步数据交换,从而在不重新加载整个页面的情况下更新部分内容。这种技术不仅提升了用户体验,还提高了应用的响应速度和效率。此外,本章还介绍了如何利用 jQuery 简化 Ajax 操作,并提供了多个实战案例,帮助读者更好地理解和掌握这一重要技术。 ... [详细]
  • 在尝试对从复杂 XSD 生成的类进行序列化时,遇到了 `NullReferenceException` 错误。尽管已经花费了数小时进行调试和搜索相关资料,但仍然无法找到问题的根源。希望社区能够提供一些指导和建议,帮助解决这一难题。 ... [详细]
  • 深入解析 Android 选择器与形状绘制技术
    本文深入探讨了 Android 中选择器(Selector)与形状绘制(Shape Drawing)技术的应用与实现。重点分析了 `Selector` 的 `item` 元素,其中包括 `android:drawable` 属性的使用方法及其在不同状态下的表现。此外,还详细介绍了如何通过 XML 定义复杂的形状和渐变效果,以提升 UI 设计的灵活性和美观性。 ... [详细]
author-avatar
手机用户2602890793
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有