Java框架之spring 的 messaging
写在前面
本文看下spring message相关的内容。
1:Message?Messaging?
Message是消息的意思,是一个名词。而Messaging是一个动名词,是将消息发送出去的意思,因此,我们的消息系统是messaging system,而非message system,像我们经常使用的消息中间件activeMQ等,就是一个messaing system,即一个用来将消息接收并且发送的系统。同理,后文我们将要看到的JMS,也是Java messaging service。
2:为什么要有MQ
服务与服务之间,通过同步的方式调用不就行了吗?为什么非得创建MQ这么个东西呢?因为同步调用方式有如下的缺点:
1:服务与服务之间的调用关系呈网状,调用关系复杂,某个服务出现问题,会引起连锁反应,降低系统稳定性。
2:同步的调用方式,当出现大量线程阻塞等待时,会给服务器资源使用带来具体的压力,降低系统稳定性。
以上可以参考下图:

可以看到调用关系极其复杂,当有n个系统时,就会存在n*(n-1)/2条线,就像蜘蛛网一样,密密麻麻,我们在设计系统时一定要避免这种情况的方法。为了解决这些问题,就出现了消息中间件,通过提供如下的能力,解决了以上的问题:
1:同步转异步
2:削峰填谷
此时结构就变为下图:

这样,组件和组件之间不直接产生关联,而是通过消息中间件间接的产生关系,系统的连线也都到消息中间件,连线的个数也从原来的n*(n-1)/2减少为n,结构更加清晰,系统运维会变得更加容易维护。
3:JMS
无规矩不成方圆,在数据库操作领域jdk中有jdbc相关的规范接口,在日志领域有JCL,SLF4J 日志门面。自然的,对于消息中间件也需要这样一个规范,这也就是就是jdk中的JMS,java messaging service,Java消息服务,在JMS中定义了queue和topic的概念,其中queue是一种生产消费的模式,消息最终只会被一个消费者接收,topic是一种发布订阅模式,消息可以被所有的订阅者接收,如下图:

JMS规范最常见的实现就是activeMQ了,所以接下来我们也以activeMQ为例,来看下如何通过spring message模块的功能来收发消息。
4:spring messaging
[源码] (https://gitee.com/dongsir2020/dongshidaddy-labs-new/tree/master/jms/src/main/java/dongshi/daddy/springmessaging)。
spring messaging模块在spring源码中的位置如下图:

为了测试,首先我们需要安装activeMQ,在这里 下载对应操作系统的安装包,下载完毕之后就可以按照如下方式启动了:

我这里是直接双击win64/activemq.bat,运行,运行后访问http://localhost:9161/,默认是8161,因为我本地8161端口被占用了,所以修改成了9161,正常直接使用8161就行,之后点击Manage ActiveMQ broker就可以进入如下的界面:

接着我们来使用spring messaging来向其生产和消费消息,首先定义生产者xml,如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><context:component-scan base-package="dongshi.daddy.springmessaging"/><bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"><property name = "brokerURL" value="tcp://localhost:61616" /></bean><bean id="queue" class="org.apache.activemq.command.ActiveMQQueue"><constructor-arg value = "test.queue" /></bean><bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"><property name = "connectionFactory" ref="connectionFactory" /></bean></beans>
接着定义生产者的类:
@Component
public class SendService {@AutowiredJmsTemplate jmsTemplate;public void send(final Student user) {jmsTemplate.send("test.queue", new MessageCreator() {public Message createMessage(Session session) throws JMSException {return session.createObjectMessage(JSON.toJSONString(user));}});}
}public class JmsSender {public static void main(String[] args) {Student student2 = Student.create();ApplicationContext context = new ClassPathXmlApplicationContext("classpath:springjms-sender.xml");SendService sendService = (SendService) context.getBean("sendService");student2.setName("KK103");sendService.send(student2);System.out.println("send successfully, please visit http://localhost:8161/admin to see it");}}
运行JmsSender后,查看activeMQ:

接着我们定义消费者消费消息,xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:jms="http://www.springframework.org/schema/jms"xsi:schemaLocation="http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-3.0.xsd"><context:component-scan base-package="dongshi.daddy.springmessaging"/><bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"><property name = "brokerURL" value="tcp://localhost:61616" /><property name="trustAllPackages" value="true" /></bean><bean id="queue" class="org.apache.activemq.command.ActiveMQQueue"><constructor-arg value = "test.queue" /></bean><bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"><property name = "connectionFactory" ref="connectionFactory" /></bean><jms:listener-containercontainer-type="default"connection-factory="connectionFactory"acknowledge="auto"><jms:listener destination="test.queue" ref="jmsListener" method="onMessage"></jms:listener></jms:listener-container></beans>
接收类:
@Component(value = "jmsListener")
public class JmsListener implements MessageListener {//收到信息时的动作@Overridepublic void onMessage(Message m) {ObjectMessage message = (ObjectMessage) m;try {System.out.println("收到的信息:" + message.getObject());} catch (JMSException e) {e.printStackTrace();}}
}public class JmsReceiver {public static void main( String[] args ) throws IOException {ApplicationContext context = new ClassPathXmlApplicationContext("classpath:springjms-receiver.xml");System.in.read();System.out.println("send successfully, please visit http://localhost:8161/admin to see it");}}
运行JmsReceiver,console输出:
received message: {"id":102,"name":"KK103"}

这样就完成了消息的生产和消费了。
写在后面
参考文章列表
相关文章:
Java框架之spring 的 messaging
写在前面 本文看下spring message相关的内容。 1:Message?Messaging? Message是消息的意思,是一个名词。而Messaging是一个动名词,是将消息发送出去的意思,因此,我们的消息系统是messaging s…...
linux使用grep命令查询nginx的进程情况时总是出现 grep --color=auto nginx
问题: 每次使用ps aux | grep 服务名 命令查询某个服务的进程时,总会出现一条grep --colorauto 服务名 例如: ps aux | grep nginx # 会出现图片中的情况解答: 这是因为grep 也是一条命令,它在输出时,会…...
FFmpeg音视频开发知识点(二)
系列文章目录 FFmpeg音视频开发知识点(一) 文章目录 系列文章目录前言一、AAC音频编码1. ffmpeg编译第三方的libfdk_aac2. S16重采样FLTP 二、AAC音频解码总结 前言 该篇讲解一下,音频编解码中的难点,以及开发过程中遇到问题&am…...
【Java可执行命令】(十)JAR文件签名工具 jarsigner:通过数字签名及验证保证代码信任与安全,深入解析 Java的 jarsigner命令~
Java可执行命令之jarsigner 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法3.1.1 可选参数:jarsigner -keystore < url>3.1.2 可选参数:jarsigner -storepass <口令>3.1.3 可选参数:jarsigner -keypass <口令>3.1.4 可选参…...
c#调用c++ dll,Release版本内存访问错误
最近遇到个比较经典的案例,在c#中调用yara进行文件检测,yara是c编写的一个非常强大库,github有个大佬用c#对其进行了封装,使其能在跨平台下,只需编译yara的so或dll就能直接跑。但总是在Release版本下时不时就崩溃&…...
内网安全:Cobalt Strike 与 MSF 联动( 会话 相互转移 )
内网安全:Cobalt Strike 与 MSF 联动( 会话 相互转移 ) 在渗透中,有时候 Cobalt Strike 会话可能会受限制,所以我们需要把 Cobalt Strike 会话转移到 MSF 上进行后面的渗透。也有的时候会话在 MSF 上,但是…...
性能测试讲解超详细Jmeter
目录 什么是性能 性能测试的目的 功能测试和性能测试 基准测试 负载测试 稳定性测试 压力测试 并发测试 总结 性能测试指标 响应时间 并发数 吞吐量 点击数 错误率 资源使用率 总结 性能测试流程 性能测试需求分析 性能测试计划和方案 编辑性能测试用例编辑 性…...
微服务 – Spring Cloud – Nacos 配置中心
微服务 – Spring Cloud – Nacos 配置中心 文章目录 微服务 – Spring Cloud – Nacos 配置中心打开nacos面板新建配置引入依赖配置文件启动类业务类打开nacos面板新建配置 Data ID: nacos-config-client-dev.yaml Group: DEV-CLOUD2023 config:info: config info lalalal …...
超细,设计一个“完美“的测试用例,用户登录模块实例...
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 好的测试用例一定…...
【C#】文件拖拽,获取文件路径
系列文章 【C#】编号生成器(定义单号规则、固定字符、流水号、业务单号) 本文链接:https://blog.csdn.net/youcheng_ge/article/details/129129787 【C#】日期范围生成器(开始日期、结束日期) 本文链接:h…...
SAP PI/PO初步了解 2023.07.03
SAP PI/PO 是SAP 提供的一种集成中间件解决方案,用于在组织内部或不同组织之间实现系统的无缝通信和数据交换。它使企业能够以统一高效的方式集成各种应用和系统,无论这些系统的技术平台或数据格式如何。 以下是关于SAP PI/PO的简要概述: 1…...
Java中生产者消费者模型
在Java中,生产者消费者模型是一种常见的多线程编程模型,用于解决生产者和消费者之间的数据交互问题。 简介 生产者(Producer)负责生成数据,并将数据放入共享的缓冲区(队列)中。消费者…...
测试Hyperledger Fabric环境
首先进入fabric-samples目录中的first-networked 子目录 cd fabric-samples/first-network 在first-network目录下有一个自动化脚本byfn.sh,可以使用-help参数查看相应的可 用命令,在命令提示符中输入如下命令: ./byfn.sh --help命令执行成功后&#…...
ClickHouse查询sql长度超超过最大限制
ClickHouse查询sql长度超超过最大限制 Max query size exceeded ClickHouse exception, message: Code: 62. DB::Exception: Syntax error: failed at position 262102 (‘fwm00ud6a3ynu0kaxr.ya0eyemkbzdvrxkhwgchccll’) (line 10406, col 17): fwm00ud6a3ynu0kaxr.ya0eyemk…...
【Axure教程】拖动调整行高列宽的表格
表格是在系统软件中非常常用的工具。表格通常由行和列组成,用于以结构化的方式显示和组织数据。它们在各种场景中都有广泛的应用,包括数据分析、数据录入、报表生成、项目管理和数据可视化等领域。 今天作者就教大家如何在Axure里制作一个能通过鼠标拖动…...
中间件-netty(1)
netty 前言篇 文章目录 一、IO基础篇1.概念1.1 阻塞(Block)和非阻塞(Non-Block)1.2 同步(Synchronization)和异步(Asynchronous)1.3 BIO 与 NIO 对比1.3.1 面向流与面向缓冲1.3.2 阻塞与非阻塞1.3.3 选择器的问世 2.NIO 和 BIO 如何影响应用程序的设计2.1 API调用2.2 数据处理2…...
【方法】想把PDF文档转换成PPT,如何操作?
很多小伙伴在工作中,会使用PDF或者PPT来展示内容。那如果需要把PDF转换成PPT,要如何操作呢? 我们知道,PPT转换成PDF很容易操作,只需通过PPT的【导出】选项,就可以直接转换成PDF;还可以通过“另…...
Linux--设置目录或文件的默认权限:umask权限掩码
目录起始权限是从777,普通文件起始权限从666 为何我们创建一个目录或文件,默认权限是你所看到的样子? 因为凡是在umask中出现的权限,都不应该在最终权限中出现! 最终权限起始权限&(~umask)…...
C++实现websocket单server单client全双工通信(基于boost!!!)
自身环境:ubuntu18.04gcc7.5.0boost1.7,3 环境配置 gcc或者g一般都有,这里主要介绍一下boost的配置方法 执行如下代码: wget https://boostorg.jfrog.io/artifactory/main/release/1.73.0/source/boost_1_73_0.tar.bz2 --no-check-cert…...
好用的网址5
搜番神器:https://trace.moe/ Online converter:Online converter - convert video, images, audio and documents for free 格式转换 GIF Explode:https://gif-explode.com/ SongDonkey:SongDonkey - AI Online Audio Split…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
