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

SpringBoot整合JMS相关推荐

  1. Springboot 整合 JMS

    ActiveMQ JMS 仅支持 Java 平台. 由于 JMS 是一套标准,所以 SpringBoot 整合 JMS 必然是整合 JMS 的某一个实现. Apache ActiveMQ 是一个开源的 ...

  2. ActiveMQ入门-ActiveMQ跟SpringBoot整合发送接收Queue

    很多教程中,会介绍原生demo,原生demo在实际开发中不会用到,而且代码量比较大,而且不好理解,也没什么用,所以我们课程不介绍.我们的课程主打实战,所以只会介绍跟SpringBoot整合的方案. 新 ...

  3. SpringBoot整合 ActiveMQ、SpringBoot整合RabbitMQ、SpringBoot整合Kafka

    1.概念:SpringBoot 整合消息服务2.具体内容对于异步消息组件在实际的应用之中会有两类:· JMS:代表作就是 ActiveMQ,但是其性能不高,因为其是用 java 程序实现的:· AMQ ...

  4. Springboot整合ActiveMQ发送邮件

    虽然ActiveMQ以被其他MQ所替代,但仍有学习的意义,本文采用邮件发送的例子展示ActiveMQ 文章目录 1. 生产者 1.1 引入maven依赖 1.2 application.yml配置 1 ...

  5. activeMQ基础学习和SpringBoot整合activeMQ案例

    昨天仔细研究了activeMQ消息队列,也遇到了些坑,昨天晚上也写了篇文章记录坑的内容,其实上篇文章(SpringBoot整合activeMQ消息队列手动签收(Session.CLIENT_ACKNO ...

  6. RabbitMq详解+SpringBoot整合RabbitMq快速入门

    1概述: 1.1.什么是MQ 消息队列(Message Queue,简称MQ),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已. 其主要用途:不同进程Pro ...

  7. springboot整合ActiveMQ(点对点和发布订阅)

    springboot整合ActiveMQ(点对点和发布订阅) ActiveMQ是什么,为什么使用MQ 是基于 Java 中的 JMS 消息服务规范实现的一个消息中间件. 1.系统解耦 采用中间件之后, ...

  8. SpringBoot整合RabbitMq实战(一)

    1 Spring AMQP 简介 Spring AMQP项目是一个引入Spring核心概念用于基于高级消息队列(AMQP)的解决方案的开发,它提供了一个模板用于发送和接受消息的高级抽象.它对基于消息驱 ...

  9. SpringBoot整合第三方技术学习笔记(自用)

    SpringBoot整合第三方技术学习笔记 搬运黑马视频配套笔记 KF-4.数据层解决方案 KF-4-1.SQL 回忆一下之前做SSMP整合的时候数据层解决方案涉及到了哪些技术?MySQL数据库与My ...

最新文章

  1. Evernote中国版、优秀的笔记软件
  2. eeglab中文教程系列(15)-绘制独立成分ERP贡献
  3. Java,开源,分享
  4. isight参数优化理论与实例详解_【iSight】iSIGHT Matlab简单算例
  5. boost::timer::cpu_timer相关的测试程序
  6. Linux操作系统-命令-free
  7. github/gitlab同时管理多个ssh key
  8. Python刷csdn访问量
  9. rpm遇到的坑-与VMP冲突
  10. beginnersbook C++ 教程·翻译完成 | ApacheCN
  11. node mysql 查询_Node.js使用mysql进行查询详解
  12. php在HTML的遍历,php里面怎么循环嵌入html元素
  13. Visual Studio 2010 使用Windows Media Player控件实现播放音乐视频
  14. 极值波延拓matlab函数,函数极值是什么意思
  15. 戴尔t310服务器装系统步骤,dell笔记本重装系统教程
  16. mysql通过字段值查询表名
  17. Jenkins笔记02-Jenkins安装和持续集成环境配置
  18. 思科CCNA第一本教材 第十一章 配置和测试网络 个人总结
  19. java 雷霆战机 教程,java swing实现简单的雷霆战机小游戏项目源码附带视频指导修改教程...
  20. ModelSim 修改测量时间显示的单位

热门文章

  1. 父---->曾孙,跨多层组件传值方法provide/inject
  2. MySQL DML数据库操作
  3. mysql字段值是什么_什么是数据库字段值
  4. 刻录dvd的数据大约只能保存两年
  5. IDE硬盘驱动器读写过程
  6. vscode之git配置
  7. 【Android】Bug:SSL peer shut down incorrectly 的解决方法
  8. AndroidStudio下使用cmake开发ndk
  9. HTC SteamVR 不使用头盔,单独使用Tracker(追踪器)
  10. 计算机台式的尺寸,台式电脑屏幕尺寸_台式电脑屏幕有多大