SpringBoot activemq收发消息、配置及原理

SpringBoot集成消息处理框架

Spring framework提供了对JMS和AMQP消息框架的无缝集成,为Spring项目使用消息处理框架提供了极大的便利。

与Spring framework相比,Spring Boot更近了一步,通过auto-configuration机制实现了对jms及amqp主流框架如ActiveMQ、RabbitMQ以及Kafka的自动配置,应用层开发过程中无需自己配置,只要classpath下加入了相应的消息处理框架包,Spring Boot会自动完成加载,程序员直接就可以使用,简直不能再方便了。

JMS

The Java Message Service (JMS) API is a messaging standard that allows application components based on the Java Platform Enterprise Edition (Java EE) to create, send, receive, and read messages. It enables distributed communication that is loosely coupled, reliable, and asynchronous.

JMS是java message service的简称,是一个基于java的消息处理规范,允许基于JAVA EE平台的应用组件创建、发送、接收、读取消息。使得分布式通讯耦合度更低、更加可靠、异步处理。

JMS提供两种编程模式:

Point-to-Point—Messages are sent to a single consumer using a JMS queue.
Publish and Subscribe—Messages are broadcast to all registered listeners through JMS topics.

点对点通讯:消息通过队列发送给单一的消费者。
发布订阅模式:消息通过主题以广播的形式发送给所有的订阅者。

JMS规范规定了5种不同类型的消息体:
在这里插入图片描述

  1. StreamMessage:流式消息,顺序读取。
  2. MapMessage:键值对消息,可顺序读取,也可以通过键随机读取。
  3. TextMessage:文本消息,当初制定规范时候认为xml会成为最主流的消息载体,通过TextMessage可以发送xml格式的文本数据。
  4. ObjectMessage:对象消息,java对象序列化后发送。
  5. BytesMessage:字节消息。

JMS API对消息的发送、接收、存储等操作做了约定,每一个JMS消息框架的提供者(实现者)都必须遵守这些约定。

ActiveMQ

ActiveMQ是Apache旗下的、基于JMS的一款开源消息处理中间件,官网介绍:

Apache ActiveMQ® is the most popular open source, multi-protocol, Java-based message broker. It supports industry standard protocols so users get the benefits of client choices across a broad range of languages and platforms. Connect from clients written in JavaScript, C, C++, Python, .Net, and more. Integrate your multi-platform applications using the ubiquitous AMQP protocol. Exchange messages between your web applications using STOMP over websockets. Manage your IoT devices using MQTT. Support your existing JMS infrastructure and beyond. ActiveMQ offers the power and flexibility to support any messaging use-case.

最流行的开源、多协议、基于JAVA的消息处理中间件。支持工业级协议所以用户可以从多语言、跨平台的客户端选择中受益。等等…

目前ActiveMQ有两个主流版本:
在这里插入图片描述

There are currently two “flavors” of ActiveMQ available - the well-known “classic” broker and the “next generation” broker code-named Artemis. Once Artemis reaches a sufficient level of feature parity with the “Classic” code-base it will become the next major version of ActiveMQ. Initial migration documentation is available as well as a development roadmap for Artemis.

等到代表“下一代”的Artemis成熟之后,就会替代“classic”成为ActiveMQ的主版本。

ActiveMQ的下载安装

官网找一个合适的版本下载安装即可,非常简单。

安装后提供了一个管理端口:
在这里插入图片描述
可以通过管理端口做测试,管理端口是8161,而默认的MQ服务端口是61616。

SpringBoot项目自动配置ActiveMQ

首先初步了解一下SpringBoot对ActiveMQ的集成情况,轻车熟路的,检查一下auto-configuration:

在这里插入图片描述
找到这个JmsAutoConfiguration类:

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ Message.class, JmsTemplate.class })
@ConditionalOnBean(ConnectionFactory.class)
@EnableConfigurationProperties(JmsProperties.class)
@Import(JmsAnnotationDrivenConfiguration.class)
public class JmsAutoConfiguration {

很明显,他就是SpringBoot的自动配置类,如果classpath下存在Message.class, JmsTemplate.class 类、以及Spring容器中存在ConnectionFactory Bean的话就会被启用。检查一下代码发现他会自动装配JmsTemplate、JmsMessagingTemplate等对象到Spring IoC容器中。

SpringBoot项目引入ActiveMQ

POM文件引入:

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

以上starter包含了spring-jms以及activemq的相关配置,所以通过以上对auto-configuration的分析,JmsTemplate以及JmsMessagingTemplate等相关组件会被SpringBoot自动配置好,后面我们就可以直接拿来使用了。

ps:JmsTemplate组件的自动配置过程源码也比较复杂,今天暂时不涉及。

到此,其实我们并没做什么具体的工作,但是ActiveMQ已经准备好了,我们项目中就可以直接使用JmsTemplate收发消息了。

消息发送

在application.yml文件中加入activeMQ的配置:

spring:activemq:broker-url: tcp://localhost:61616user: adminpassword: admin

消息发送类中通过自动装配引入JmsTemplate:

    @Autowiredprivate JmsTemplate jmsTemplate;

消息发送方法:

    public void sendMessage(String message){jmsTemplate.send("active.myqueue", new MessageCreator() {@Overridepublic Message createMessage(Session session) throws JMSException {// 也可以创建对象 session.createObjectMessage()TextMessage textMessage = session.createTextMessage();textMessage.setText(message);return textMessage;}});}

Controller中加入对sendMessage方法的调用,以便测试:

    @GetMapping ("/sendmessage/{msg}")public String sendMessage(@PathVariable String msg){userService.sendMessage(msg);return "hello";}

消息接收

同样,消息接收方法中通过自动装配引入JmsTemplate。

消息接收方法:

    public String revieveMessage(){String message = (String)jmsTemplate.receiveAndConvert("active.myqueue");log.info("revieved message:"+message);return message;}

Controller方法中加入接收方法以便测试:

    @GetMapping ("/recievemsg")public String recieveMessage(){return userService.revieveMessage();}

这样,activeMQ的“点对点模式”收发消息的代码准备完毕,非常简单。

验证

首先启动activeMQ,启动之后在ActiveMQ的管理端监控队列(截图之前我已经测试过一次消息收发了,如果没测试过的话,队列是空的,不会存在active.myqueue这个队列):
在这里插入图片描述
启动我们刚才创建的测试应用,测试发送消息:
在这里插入图片描述
发送消息 1230230,收到反馈“hello”,说明消息发送成功。

我们从ActiveMQ管理端查看队列:
在这里插入图片描述
Number of pending Message 队列中尚未消费的消息数量为1,说明我们刚才的消息已经成功发送到队列中了。

消息接收测试:
在这里插入图片描述
成功接收到消息1230230。

再次从ActiveMQ管理端验证:
在这里插入图片描述
队列中的pending message数量变为0,入队数量和出队数量都为1,说明刚才的消息已经被成功消费。

此时,队列中尚未消费的数量为0的情况下,如果再次执行消息消费方法(recievemsg方法),消费方法会阻塞等待,直到再次调用消息发送方法发送一条新消息到队列、消费方法获取到新消息后结束阻塞等待。

监听器方式接收消息

发布订阅模式与点对点模式的区别主要是在消息接收端,Spring提供了接收消息的注解@JmsListener。

@JmsListener需要与@Component家族的注解结合使用,UserService中编写两个listener监听active.listenqueue::


@Service
@Slf4j
public class UserService {@Autowiredprivate JmsTemplate jmsTemplate;@JmsListener(destination = "active.listenqueue")public void revieveMsgListener(String content){log.info("revieveMsgListener:"+ content);}@JmsListener(destination = "active.listenqueue")public void revieveMsgListenerA(String content){log.info("revieveMsgListenerA"+content);}

UserService编写一个向该ActiveMQ发送消息的方法:

 public void sendMessage(String message){jmsTemplate.send("active.listenqueue", new MessageCreator() {@Overridepublic Message createMessage(Session session) throws JMSException {// 也可以创建对象 session.createObjectMessage()TextMessage textMessage = session.createTextMessage();textMessage.setText(message);return textMessage;}});}

Controller中调用发送方法:

    @GetMapping ("/sendmessage/{msg}")public String sendMessage(@PathVariable String msg){userService.sendMessage(msg);return "hello";}

}

启动activeMQ,启动项目之后,查看activemq的admin端:
在这里插入图片描述

active.listenqueue以及2个监听器已经注册到ActiveMQ中,发送消息:
在这里插入图片描述

检查应用已经接收到了消息:
在这里插入图片描述
但是只有一个监听器接收到了消息,反复发送消息,后台log发现两个监听器轮番收到消息、但是一条消息不能被两个监听器同时接收到:
在这里插入图片描述

发布订阅模式

发布订阅模式下,消息发送给topic,订阅者仅订阅感兴趣的topic内的消息,消息消费完成后并不会从topic中消失,多个消费者可以从同一个topic内消费消息,所以,一条消息允许被多次消费。

默认情况下,SpringBoot集成ActiveMQ采用的是点对点队列模式,application.yml文件配置 spring:jms:pub-sub-domain参数为true开启topic模式:

spring:activemq:broker-url: tcp://localhost:61616user: adminpassword: adminjms:pub-sub-domain: true

启动activeMQ,启动项目,topic下看到项目中启动的两个topic:
在这里插入图片描述
调用sendmessage方法发送消息:
在这里插入图片描述
检查ActiveMQ状态,可以发现1条消息成功发送到队列中,被2个消费者分别消费了一次、消息共被消费了2次:
在这里插入图片描述
检查log:
在这里插入图片描述
两个监听方法都接收到了消息。

OK,let’s say it’s a day!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/649628.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

首发:2024全球DAO组织发展研究

作者&#xff0c;张群&#xff08;专注DAO及区块链应用研究&#xff0c;赛联区块链教育首席讲师&#xff0c;工信部赛迪特邀资深专家&#xff0c;CSDN认证业界专家&#xff0c;微软认证专家&#xff0c;多家企业区块链产品顾问&#xff09; DAO&#xff08;去中心化自治组织&am…

03-Redis缓存高可用集群

文章目录 1、Redis集群方案比较2、Redis高可用集群搭建redis集群搭建Java操作redis集群 4、Redis集群原理分析槽位定位算法跳转重定位Redis集群节点间的通信机制gossip通信的10000端口网络抖动 Redis集群选举原理分析集群脑裂数据丢失问题集群是否完整才能对外提供服务Redis集群…

LC 2846. 边权重均等查询

2846. 边权重均等查询 难度&#xff1a; 困难 题目大意&#xff1a; 现有一棵由 n 个节点组成的无向树&#xff0c;节点按从 0 到 n - 1 编号。给你一个整数 n 和一个长度为 n - 1 的二维整数数组 edges &#xff0c;其中 edges[i] [ui, vi, wi] 表示树中存在一条位于节点 …

Android studio环境搭建过程异常

异常1 e: file:///D:/project/AndroidProject/settings.gradle.kts:5:21: Unexpected tokens (use ; to separate expressions on the same line) dependencyResolutionManagement {repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)repositories { // …

第16章_网络编程(网络通信要素,TCP与UDP协议,网络编程API,TCP网络编程,UDP网络编程,URL编程)

文章目录 第16章_网络编程本章专题与脉络1. 网络编程概述1.1 软件架构1.2 网络基础 2. 网络通信要素2.1 如何实现网络中的主机互相通信2.2 通信要素一&#xff1a;IP地址和域名2.2.1 IP地址2.2.2 域名 2.3 通信要素二&#xff1a;端口号2.4 通信要素三&#xff1a;网络通信协议…

BLIP-2: 基于冻结图像编码器和大型语言模型的语言-图像预训练引导

BLIP-2: 基于冻结图像编码器和大型语言模型的语言-图像预训练引导 项目地址BLIP-2的背景与意义BLIP-2的安装与演示BLIP-2模型库图像到文本生成示例特征提取示例图像-文本匹配示例性能评估与训练引用BLIP-2Hugging Face集成 在语言-图像预训练领域&#xff0c;BLIP-2的出现标志着…

深度学习分类问题之Logistic Regression

逻辑回归模型&#xff0c;虽然名字是回归&#xff0c;但是是解决分类问题。 在线性回归里面&#xff0c;我们根据有效信息&#xff0c;预测下一个由已知信息得到的数值&#xff0c;叫做回归问题&#xff0c;但是在机器学习里面&#xff0c;常见的是分类问题。最常见的就是MNIS…

React16源码: React中commitAllHostEffects内部的commitDeletion的源码实现

commitDeletion 1 &#xff09;概述 在 react commit 阶段的 commitRoot 第二个while循环中调用了 commitAllHostEffects&#xff0c;这个函数不仅仅处理了新增节点&#xff0c;更新节点最后一个操作&#xff0c;就是删除节点&#xff0c;就需要调用 commitDeletion&#xff0…

《动手学深度学习(PyTorch版)》笔记4.5

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过。…

掌握可视化大屏:提升数据分析和决策能力的关键(下)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

(大众金融)SQL server面试题(3)-客户已用额度总和

今天&#xff0c;面试了一家公司&#xff0c;什么也不说先来三道面试题做做&#xff0c;第三题。 那么&#xff0c;我们就开始做题吧&#xff0c;谁叫我们是打工人呢。 题目是这样的&#xff1a; DEALER_INFO经销商授信协议号码经销商名称经销商证件号注册地址员工人数信息维…

three.js 鼠标选中模型弹出标签

效果&#xff1a;请关注抖音 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red;position: relative;"></div><…

202410读书笔记|《半小时漫画青春期》——成为自己世界的星星,这才是最要紧的事儿

202410读书笔记|《半小时漫画青春期&#xff1a;心理篇》——成为自己世界的星星&#xff0c;这才是最要紧的事儿 一、一到考试就焦虑&#xff0c;怎么办&#xff1f;二、以前情绪挺淡定&#xff0c;现在咋动不动就爆发&#xff1f;三、追星那么开心&#xff0c;为啥还要我小心…

ajax点击搜索返回所需数据

html 中body设置&#xff08;css设置跟进自身需求&#xff09; <p idsearch_head>学生信息查询表</p> <div id"div_1"> <div class"search_div"> <div class"search_div_item"> …

数据库设计的一些原则

文章目录 数据库设计原则表之间的关系一对一关系&#xff08;了解&#xff09;一对多&#xff08;多对一&#xff09;多对多联合主键和复合主键 数据库设计准则-范式1、函数依赖2、完全函数依赖3、部分函数依赖4、传递函数依赖5、码 第一范式第二范式第三范式第三范式 数据库设…

【原神游戏开发日志3】登录和注册有何区别?

版权声明&#xff1a; ● 本文为“优梦创客”原创文章&#xff0c;您可以自由转载&#xff0c;但必须加入完整的版权声明 ● 文章内容不得删减、修改、演绎 ● 本文视频版本&#xff1a;见文末 ● 相关学习资源&#xff1a;见文末 前言 ● 这是我们原神游戏开发日记的第三期 ●…

TensorFlow2实战-系列教程1:回归问题预测

&#x1f9e1;&#x1f49b;&#x1f49a;TensorFlow2实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 1、环境测试 import tensorflow as tf import numpy as np tf.__version__打印结果 ‘…

2024年材料、控制工程与制造技术国际学术会议(ICMCEMT 2024)

2024年材料、控制工程与制造技术国际学术会议(ICMCEMT 2024) 2024 International Conference on Materials, Control Engineering, and Manufacturing Technology (ICMCEMT 2024) 会议简介&#xff1a; 2024年材料、控制工程与制造技术国际学术会议(ICMCEMT 2024)定于2024年在…

分布式因果推断在美团履约平台的探索与实践

美团履约平台技术部在因果推断领域持续的探索和实践中&#xff0c;自研了一系列分布式的工具。本文重点介绍了分布式因果树算法的实现&#xff0c;并系统地阐述如何设计实现一种分布式因果树算法&#xff0c;以及因果效应评估方面qini_curve/qini_score的不足与应对技巧。希望能…

ERROR Failed to get response from https://registry.npm.taobao.org/ 错误的解决

这个问题最近才出现的。可能跟淘宝镜像的证书到期有关。 解决方式一&#xff1a;更新淘宝镜像&#xff08;本人测试无效&#xff0c;但建议尝试&#xff09; 虽然无效&#xff0c;但感觉是有很大关系的。还是设置一下比较好。 淘宝镜像的地址&#xff08;registry.npm.taobao…