SpringBoot整合JMS

article/2025/9/22 4:45:26

SpringBoot整合JMS

文章目录

  • SpringBoot整合JMS
  • 前言
  • 一、JMS、AMQP概念以及区别
  • 二、ActiveMQ安装
  • 三、SpringBoot整合ActiveMQ:队列模式实例
    • 1、创建demo项目
    • 2、添加依赖
    • 3、添加application配置
    • 4、添加配置文件ActiveMQConfig
    • 5、创建JMS组件文件
    • 6、发送消息控制器
    • 7、测试验证
  • 四、SpringBoot整合ActiveMQ:广播模式实例
    • 1、创建demo项目
    • 2、添加依赖
    • 3、添加application配置
    • 4、添加配置文件ActiveMQConfig
    • 5、创建JMS组件文件
    • 6、发送消息控制器
    • 7、测试验证
    • 8、配置同时支持队列模式和广播模式

前言

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

一、JMS、AMQP概念以及区别

  • JMS

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

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

JMS仅支持JAVA平台,不支持跨平台、跨语言。

  • AMQP

AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。例如RabbitMQ消息中间件。

  • 两者区别

JMS是定义了统一的接口,来对消息操作进行统一;
AMQP是通过规定协议来统一数据交互的格式,
JMS限定了必须使用Java语言;
AMQP只是协议,不规定实现方式,因此是跨语言的。
JMS规定了两种消息模型;而AMQP的消息模型更加丰富。

二、ActiveMQ安装

wget https://archive.apache.org/dist/activemq/5.16.0/apache-activemq-5.16.0-bin.tar.gz
mv apache-activemq-5.16.0-bin.tar.gz /usr/local/
cd /usr/local/
tar -zxvf apache-activemq-5.16.0-bin.tar.gz apache-activemq-5.16.0
chmod 777 apache-activemq-5.16.0 <==为目录设置权限
cd apache-activemq-5.16.0/bin/
chmod 755 activemq <==为命令设置权限
./activemq start

默认端口8161,访问http://192.168.138.135:8161/

  • 1、遇到问题
    http://192.168.138.135:8161/无法访问
    现象描述
    远程telnet 192.168.138.135 8161不通
    本机telnet 192.168.138.135 8161不通
    本机telnet 127.0.0.1 8161通
    解决办法
    /usr/local/apache-activemq-5.16.0/conf中jetty.xml中,将下图中127.0.0.1–》改成0.0.0.0.,允许所有ip访问,重启服务即可。
    在这里插入图片描述
    ActiveMQ启动成功后访问http://192.168.138.135:8161/时,默认用户密码都是admin
    在这里插入图片描述
    单机Manage ActiveMQ broker进入控制台

Linux知识点
linux 命令chmod 755的意思
chmod是Linux下设置文件权限的命令,后面的数字表示不同用户或用户组的权限。
一般是三个数字:
第一个数字表示文件所有者的权限
第二个数字表示与文件所有者同属一个用户组的其他用户的权限
第三个数字表示其它用户组的权限。
权限分为三种:读(r=4),写(w=2),执行(x=1) 。 综合起来还有可读可执行(rx=5=4+1)、可读可写(rw=6=4+2)、可读可写可执行(rwx=7=4+2+1)。
所以,chmod 755 设置用户的权限为:
1.文件所有者可读可写可执行 –7
2.与文件所有者同属一个用户组的其他用户可读可执行 –5
3.其它用户组可读可执行

三、SpringBoot整合ActiveMQ:队列模式实例

1、创建demo项目

https://start.spring.io/无法访问,通过https://start.springboot.io/生成一个demo项目

2、添加依赖

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

3、添加application配置

server.port=8001
spring.activemq.broker-url=tcp://192.168.138.135:61616
##配置信赖所有包,支持发送对象消息
spring.activemq.packages.trust-all=true
spring.activemq.user=admin
spring.activemq.password=admin
queueName=publish.queue

4、添加配置文件ActiveMQConfig

@Configuration
public class ActiveMQConfig {@Value("${queueName}")private String queueName;@Beanpublic Queue queue() {return new ActiveMQQueue(queueName);}}

5、创建JMS组件文件

package com.yangxf.demoActiveMQ.component;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Component;import javax.jms.Queue;/*** 〈一句话功能简述〉<br> * 〈JMS组件发送和接收消息〉** @author linwd* @create 2021/4/11* @since 1.0.0*/
@Component
public class JmsComponent {@Autowiredprivate JmsMessagingTemplate jmsMessagingTemplate;@Autowiredprivate Queue queue;/*** 发送消息*/public void send(Message message){jmsMessagingTemplate.convertAndSend(this.queue,message.toString());}/*** 接收消息*/@JmsListener(destination= "${queueName}")    //用这个注解去监听 监听的队列public void receive(String messageString){System.out.println("receive:"+messageString);}}/*** 〈一句话功能简述〉<br>* 〈封装类〉** @author linwd* @create 2021/4/11* @since 1.0.0*/
public class Message implements Serializable {private String content;private Date data;...set,get方法@Overridepublic String toString() {return "Message{" +"content='" + content + '\'' +", data=" + data +'}';}
}

6、发送消息控制器

/*** 〈一句话功能简述〉<br> * 〈发送信息控制器〉** @author linwd* @create 2021/4/11* @since 1.0.0*/
@RestController
public class JmsController {private final Logger logger=LoggerFactory.getLogger(JmsController.class);@Autowiredprivate JmsComponent jmsComponent;@GetMapping("/pushMessage")public void send(){logger.info("pushMessage推送消息");Message message=new Message();message.setContent("推送消息");message.setData(new Date());jmsComponent.send(message);}
}

7、测试验证

在这里插入图片描述
在这里插入图片描述

四、SpringBoot整合ActiveMQ:广播模式实例

1、创建demo项目

https://start.spring.io/无法访问,通过https://start.springboot.io/生成一个demo项目

2、添加依赖

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

3、添加application配置

server.port=8000
spring.activemq.broker-url=tcp://192.168.138.135:61616
##配置信赖所有包,支持发送对象消息
spring.activemq.packages.trust-all=true
spring.activemq.user=admin
spring.activemq.password=admin
queueName=publish.queue
##topicid
topicName=publish.topic
#Spring Boot集成ActiveMQ时默认只支持队列或者广播之一,通过配置项spring.jms.pub-sub-domain来指定,
# true 为广播模式,false为队列模式,默认情况下支持队列模式。
spring.jms.pub-sub-domain=true

4、添加配置文件ActiveMQConfig

@Configuration
public class ActiveMQConfig {@Value("${queueName}")private String queueName;@Value("${topicName}")private String topicName;/*** 队列模式实例** @return*/@Beanpublic Queue queue() {return new ActiveMQQueue(queueName);}/*** 订阅模式实例** @return*/@Beanpublic Topic topic() {return new ActiveMQTopic(topicName);}}

5、创建JMS组件文件

package com.yangxf.demoActiveMQ.component;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Component;import javax.jms.Queue;
import javax.jms.Topic;@Component
public class JmsComponent {@Autowiredprivate JmsMessagingTemplate jmsMessagingTemplate;@Autowiredprivate Queue queue;@Autowiredprivate Topic topic;/*** 发送消息*/public void send(Message message){jmsMessagingTemplate.convertAndSend(this.queue,message.toString());}/*** 接收消息*/@JmsListener(destination= "${queueName}")    //用这个注解去监听 监听的队列public void receive(String messageString){System.out.println("receive:"+messageString);}/*** 广播发送消息*/public void sendForTopic(Message message){jmsMessagingTemplate.convertAndSend(this.topic,message.toString());}/*** 接收消息*/@JmsListener(destination= "${topicName}")public void receiveForTopic1(String messageString){System.out.println("receive1:"+messageString);}/*** 接收消息*/@JmsListener(destination= "${topicName}")public void receiveForTopic2(String messageString){System.out.println("receive2:"+messageString);}}/*** 〈一句话功能简述〉<br>* 〈封装类〉** @author linwd* @create 2021/4/11* @since 1.0.0*/
public class Message implements Serializable {private String content;private Date data;...set,get方法@Overridepublic String toString() {return "Message{" +"content='" + content + '\'' +", data=" + data +'}';}
}

6、发送消息控制器

/*** 〈一句话功能简述〉<br> * 〈发送信息控制器〉** @author linwd* @create 2021/4/11* @since 1.0.0*/
@RestController
public class JmsController {private final Logger logger=LoggerFactory.getLogger(JmsController.class);@Autowiredprivate JmsComponent jmsComponent;@GetMapping("/pushMessage")public void send(){logger.info("pushMessage推送消息");Message message=new Message();message.setContent("推送消息");message.setData(new Date());jmsComponent.send(message);}@GetMapping("/pushMessageForTopic")public void pushMessageForTopic(){logger.info("pushMessageForTopic广播消息");Message message=new Message();message.setContent("广播消息");message.setData(new Date());jmsComponent.sendForTopic(message);}
}

7、测试验证

复制一份项目,改一下端口两个同时启动,访问其中一个服务的广播发送短信地址:http://localhost:8001/pushMessageForTopic

服务1在这里插入图片描述
服务2
在这里插入图片描述
两个服务同时接收到信息。
但是这种情况下http://localhost:8001/pushMessage无法收到信息,即不能兼容支持队列模式。

8、配置同时支持队列模式和广播模式

-简单的springboot配置无法支持这个功能,通过java配置完成
将ActiveMQConfig配置改成如下

package com.yangxf.demoActiveMQ.config;import org.apache.activemq.ActiveMQConnectionFactory;
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.context.annotation.Configuration;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.config.JmsListenerContainerFactory;import javax.jms.ConnectionFactory;
import javax.jms.Queue;
import javax.jms.Topic;/*** 〈一句话功能简述〉<br>* 〈ActiveMQConfig配置〉** @author linwd* @create 2021/4/11* @since 1.0.0*/
@Configuration
public class ActiveMQConfig {@Value("${spring.activemq.user}")private String usrName;@Value("${spring.activemq.password}")private  String password;@Value("${spring.activemq.broker-url}")private  String brokerUrl;@Value("${queueName}")private String queueName;@Value("${topicName}")private String topicName;/*** 队列模式实例** @return*/@Beanpublic Queue queue() {return new ActiveMQQueue(queueName);}/*** 订阅模式实例** @return*/@Beanpublic Topic topic() {return new ActiveMQTopic(topicName);}/*** 配置以下两个bean,同时支持队列模式和广播模式,配置中spring.jms.pub-sub-domain=true将失效* @return*/@Bean("connectionFactory")public ActiveMQConnectionFactory connectionFactory() {return new ActiveMQConnectionFactory(usrName, password, brokerUrl);}@Bean("queueListenerFactory")public JmsListenerContainerFactory<?> queueListenerFactory(ConnectionFactory connectionFactory) {DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();factory.setConnectionFactory(connectionFactory);factory.setPubSubDomain(false);return factory;}@Bean("topicListenerFactory")public JmsListenerContainerFactory <?> topicListenerFactory(ConnectionFactory connectionFactory) {DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();factory.setConnectionFactory(connectionFactory);//设置为发布订阅方式, 默认情况下使用的生产消费者方式factory.setPubSubDomain(true);return factory;}}
  • 推送消息组件中明确factory
  /*** 接收消息*/@JmsListener(destination= "${queueName}",containerFactory = "queueListenerFactory")    //用这个注解去监听 监听的队列public void receive(String messageString){System.out.println("receive:"+messageString);}/*** 接收消息*/@JmsListener(destination= "${topicName}",containerFactory = "topicListenerFactory")public void receiveForTopic1(String messageString){System.out.println("receive1:"+messageString);}

在这里插入图片描述

到此,完成SpringBoot功能整合ActiveMQ的队列模式和广播模式实战。

如果是简单的情况,可以直接在配置中完成,否则可以通过JAVA文件配置
spring.activemq.broker-url=tcp://127.0.0.1:61616
在考虑结束之前等待的时间
spring.activemq.close-timeout=15s
默认代理URL是否应该在内存中。如果指定了显式代理,则忽略此值。
spring.activemq.in-memory=true
是否在回滚回滚消息之前停止消息传递。这意味着当启用此命令时,消息顺序不会被保留。
spring.activemq.non-blocking-redelivery=false
密码
spring.activemq.password=123456
等待消息发送响应的时间。设置为0等待永远。
spring.activemq.send-timeout=0
spring.activemq.user=haha
是否信任所有包
spring.activemq.packages.trust-all=
要信任的特定包的逗号分隔列表(当不信任所有包时)
spring.activemq.packages.trusted=
当连接请求和池满时是否阻塞。设置false会抛“JMSException异常”。
spring.activemq.pool.block-if-full=true
如果池仍然满,则在抛出异常前阻塞时间。
spring.activemq.pool.block-if-full-timeout=-1ms
是否在启动时创建连接。可以在启动时用于加热池。
spring.activemq.pool.create-connection-on-startup=true
是否用Pooledconnectionfactory代替普通的ConnectionFactory。
spring.activemq.pool.enabled=false
连接过期超时。
spring.activemq.pool.expiry-timeout=0ms
连接空闲超时
spring.activemq.pool.idle-timeout=30s
连接池最大连接数
spring.activemq.pool.max-connections=1
每个连接的有效会话的最大数目。
spring.activemq.pool.maximum-active-session-per-connection=500
当有"JMSException"时尝试重新连接
spring.activemq.pool.reconnect-on-exception=true
在空闲连接清除线程之间运行的时间。当为负数时,没有空闲连接驱逐线程运行。
spring.activemq.pool.time-between-expiration-check=-1ms
是否只使用一个MessageProducer
spring.activemq.pool.use-anonymous-producers=true


http://chatgpt.dhexx.cn/article/gjHSlrRa.shtml

相关文章

JMS规范介绍

目录 1.什么是JMS规范 2.什么是MOM 3.MOM的特点 4.JMS和MOM的关联 5.JMS的体系结构 6.JMS常见基本概念 7.JMS 的事务性会话和非事务性会话 8.JMS消息的可靠性机制 1.什么是JMS规范 Java 消息服务&#xff08;Java Message Service&#xff09;是 java 平台中关于面向消息…

JMS规范

一、JMS经典模式详解 JMS即Java消息服务&#xff08;Java Message Service&#xff09;应用程序接口&#xff0c;是一个Java平台中关于面向消息中间件&#xff08;MOM&#xff0c;Message oriented Middleware&#xff09;的API&#xff0c;用于在两个应用程序之间&#xff0c…

微服务 —— 消息服务中间件 JMS

一、消息服务中间件 对于大多数应用来说&#xff0c;可采用消息服务中间件来提升系统异步通信&#xff0c;消息解耦问题。 消息的作用&#xff1a;异步处理、应用解耦、流量削峰。 异步消息中的两个概念&#xff1a;消息代理、目的地 当消息发送者发送消息&#xff0c;由消息…

JMS解析(二)——JMS简介

JMS解析&#xff08;一&#xff09;——JMS简介_踩踩踩从踩的博客-CSDN博客 前言 本篇文章会紧接着上篇文章未介绍完毕的JMS规范&#xff0c;继续消息接收、事务管理、持久化以及应用的介绍。 消息接收 消息接收分为队列接收和topic消息接收 对于队列的接收基本的consumer…

JMS(Java消息服务)(Activemq简单介绍)

是什么&#xff1f; JMS&#xff08;java消息服务&#xff09;是规范&#xff0c;它定义了一些规则&#xff0c;一些接口。具体实现由各种做这个产品的厂家或开源组织来实现。 为什么&#xff1f; 在JMS还没有诞生前&#xff0c;每个企业都会有自己的一套内部消息系统&#…

JMS解析(一)——JMS简介

消息中间件MQ及ActiveMQ介绍_踩踩踩从踩的博客-CSDN博客 前言 上篇文章对消息中间件做了个解析&#xff0c;以及ActiveMQ的安装和基本使用&#xff0c;做了个基本了解&#xff0c;因为如果不了JMS规范&#xff0c;一定是不学不好消息中间件和ActiveMQ,本篇文章会从JMS是什么&…

JMS基本概念

简介 JMS即Java消息服务&#xff08;Java Message Service&#xff09;应用程序接口&#xff0c;是一个Java平台中关于面向消息中间件&#xff08;MOM&#xff09;的API&#xff0c;用于在两个应用程序之间&#xff0c;或分布式系统中发送消息&#xff0c;进行异步通信。Java消…

JMS概述

** 一、什么是JMS ** JMS即Java消息服务&#xff08;Java Message Service&#xff09;应用程序接口&#xff0c;是一个Java平台中关于面向消息中间件&#xff08;MOM&#xff09;的API&#xff0c;用于在两个应用程序之间&#xff0c;或分布式系统中发送消息&#xff0c;进行…

深入浅出JMS(一)——JMS简介

如果手机只能进行实时通话,没有留言和短信功能会怎么样?一个电话打过来,正好没有来得及接上,那么这个电话要传递的信息肯定就收不到了。为什么不能先将信息存下来,当用户需要查看信息的时候再去获得信息呢?伴随着这个疑惑,短息和留言应运而生,无论手机是否开机、是否未…

详解 ROI Align 的基本原理和实现细节

转载至http://blog.leanote.com/post/afanti.denggmail.com/b5f4f526490b 欢迎支持原作者。 ROI Align 是在Mask-RCNN这篇论文里提出的一种区域特征聚集方式, 很好地解决了ROI Pooling操作中两次量化造成的区域不匹配(mis-alignment)的问题。实验显示&#xff0c;在检测测任务…

眼睛ROI区域裁剪

为了用深度方法训练一个睁闭眼模型&#xff0c;这里不需要再提取特征&#xff0c;而是需要用到眼睛的原图&#xff0c;第一步就是把眼睛区域裁剪下来。 本文用的是opencv的检测库shape_predictor_68_face_landmarks.dat&#xff0c;得到68特征点后&#xff0c;根据特征点来裁剪…

目标检测Fast RCNN中的ROI pooling

目标检测的任务可以分为两步&#xff1a;选出所有可能存在物体的候选框、判断候选框中的物体是否为前景或者背景。 但是这可能会产生很多的候选区域&#xff0c;如果把它们都喂入CNN&#xff0c;计算量将特别大&#xff0c;这也是rcnn效率低的原因所在。rcnn对每个候选区域都进…

ROI Pooling原理及实现

目标检测architecture通常可以分为两个阶段&#xff1a; &#xff08;1&#xff09;region proposal&#xff1a;给定一张输入image找出objects可能存在的所有位置。这一阶段的输出应该是一系列object可能位置的bounding box。这些通常称之为region proposals或者 regions of …

ROI数据分析

目录 1. 专业术语解读 2. 参考资料 1. 专业术语解读 ROI(Return On Investment)投入产出比ROI 是指通过投资而应返回的价值,即企业从一项投资活动中得到的经济回报,通俗点来说就是我们获得的收益和投入成本的比值。 如下图所示,比较多个渠道的效果,寻找最大的ROI渠道。…

ROIAlign源码详细解析

ROI Align 是在Mask-RCNN这篇论文里提出的一种区域特征聚集方式, 很好地解决了ROI Pooling操作中两次量化造成的区域不匹配(mis-alignment)的问题。 其中ROI Align用的是双线性插值(内插)来实现的&#xff0c;在分析源码前我们先来了解下什么是双线性插值。 插值定义&#xf…

Opencv----ROI设置

1 ROI概念 ROI是region of interest首字母的简写&#xff0c;翻译为感性趣的区域&#xff0c;其对象时图像。 对于图像&#xff0c;其实就是一个二维数组&#xff0c;只不过这个二维数组有点特殊&#xff0c;它有头信息&#xff0c;在头信息里会有描述这个二维数组的大小、图片…

HALCON_C#_交互ROI

GDI知识讲解 GDI英文全称&#xff1a;Graphics Device Interface Plus, GDI是对GDI的扩展。 一&#xff0e; GDI概述 二.Graphics类介绍 Graphics 类封装了很多GDI绘图对象&#xff0c;并将这些对象显示到设备上。创建Graphics对象也被称为创建一个画板&#xff0c;创建画板一共…

OpenCV之图像ROI与ROI操作

python代码&#xff1a; import cv2 as cv import numpy as npsrc cv.imread("./test.png") cv.namedWindow("input", cv.WINDOW_AUTOSIZE) cv.imshow("input", src) h, w src.shape[:2]# 获取ROI cy h//2 cx w//2 roi src[cy-100:cy100,c…

ROI Pooling和ROI Align、ROI Warp解析

文中很多内容来源于其他博客&#xff0c;较为详细&#xff0c;有需要可直接按目录跳选到自己需要的部分。 目录 简单介绍 实验比较 ROI理解 ROI Pooling ROI Pooling理解 ROI Pooling example ROI Pooling局限性 ROI Align理解 双线性插值法 ROI Align的反向传播 R…

RoI Pooling 和 RoI Align

RoI Pooling 和 RoI Align 一、背景和基本概念1.背景2.基本概念 二、RoI Pooling原理1.目的2.步骤&#xff08;以输出RoI feature大小为225为例&#xff09;Step1Step2Step3Step4 三、RoI Align原理1.目的2.步骤&#xff08;以输出RoI feature大小为225为例&#xff09;step1St…