首页 > 其他分享 >SpringBoot2.x系列教程59--SpringBoot整合消息队列之JMS简介

SpringBoot2.x系列教程59--SpringBoot整合消息队列之JMS简介

时间:2022-12-23 18:04:43浏览次数:48  
标签:订阅 SpringBoot 异步 -- JMS 队列 Session 消息


SpringBoot2.x系列教程59--SpringBoot整合消息队列之JMS简介

作者:一一哥

一. JMS协议

1. 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消息服务)是一个消息服务的标准规范或者是协议,允许应用程序组件基于JavaEE平台创建、发送、接收和读取消息,它可以使分布式通信耦合度更低,消息服务更加的可靠以及异步。

2. JMS协议简介

JMS是Java的消息服务协议,JMS的客户端之间可以通过JMS服务进行异步的消息传输.

3. JMS消息模型

JMS消息模型包括如下两种:

1️⃣.Point-to-Point(P2P);

2️⃣.Publish/Subscribe(Pub/Sub)
即点对点和发布订阅模型.

SpringBoot2.x系列教程59--SpringBoot整合消息队列之JMS简介_消息队列


4. P2P--点对点模式

SpringBoot2.x系列教程59--SpringBoot整合消息队列之JMS简介_Java_02


4.1 P2P模式涉及到的概念

  • 消息队列(Queue);
  • 发送者(Sender);
  • 接收者(Receiver);
  • 每个消息都被发送到一个特定的队列,接收者从队列中获取消息.队列保留着消息,直到他们被消费或超时.

4.2 P2P模式的特点

1️⃣.每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中);

2️⃣.发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被发送到队列;

3️⃣.接收者在成功接收消息之后需向队列应答成功.

如果你希望发送的每个消息都应该被成功处理的话,那么你需要P2P模式.

5. Pub/Sub--发布/订阅模式

SpringBoot2.x系列教程59--SpringBoot整合消息队列之JMS简介_Java_03

5.1 P/S模式涉及到的概念

  • 主题(Topic);
  • 发布者(Publisher);
  • 订阅者(Subscriber);
  • 客户端将消息发送到主题,多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者.

5.2 Pub/Sub模式的特点

1️⃣.每个消息可以有多个消费者;

2️⃣.发布者和订阅者之间有时间上的依赖性.针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息,而且为了消费消息,订阅者必须保持运 行的状态;

3️⃣.为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅.这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息.

如果你希望发送的消息可以不被做任何处理,或者被一个消息者处理,或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型.

6. 消息的消费方式

在JMS中,消息的产生和消费是异步的。对于消费来说,JMS的消息者可以通过两种方式来消费消息.

6.1 同步

订阅者或接收者调用receive()方法来接收消息,receive()方法在能够接收到消息之前(或超时之前)将一直阻塞; 

6.2 异步

订阅者或接收者可以注册为一个消息监听器.当消息到达之后,系统自动调用监听器的onMessage()方法.

7. JMS协议的优点

我们先来看看下图,应用程序A将Message发送到服务器上,然后应用程序B从服务器中接收A发来的消息,通过这个图我们一起来分析一下JMS的好处:

SpringBoot2.x系列教程59--SpringBoot整合消息队列之JMS简介_应用程序_04

1️⃣.提供消息灵活性;
2️⃣.松散耦合;
3️⃣.异步性.

8. JMS消息协议的API

JMS中的关键API接口:

SpringBoot2.x系列教程59--SpringBoot整合消息队列之JMS简介_Java_05

8.1 ConnectionFactory

用于创建连接到消息中间件的连接工厂,针对两种不同的JMS消息模型,分别有QueueConnectionFactory和TopicConnectionFactory两种.可以通过JNDI来查找ConnectionFactory对象.

8.2 Destination

Destination的意思指消息发布的地点,包括队列模式和主体模式。对于消息生产者来说,它的Destination是某个队列(Queue)或某个主题(Topic);对于消息消费者来说,它的Destination也是某个队列或主题(即消息来源).

所以,Destination实际上就是两种类型的对象:Queue、Topic可以通过JNDI来查找Destination.

8.3 Connection

Connection表示在客户端和JMS系统之间建立的链接(对TCP/IP socket的包装),代表了应用程序和服务之间的连接通路。Connection可以产生一个或多个Session,跟ConnectionFactory一样,Connection也有两种类型:QueueConnection和TopicConnection.

8.4 Session

Session是我们操作消息的接口,表示一个单线程的上下文,用于发送和接受消息。可以通过Session创建生产者,消费者,消息等。

Session提供了事务的功能.当我们需要使用Session发送/接收多个消息时,可以将这些发送/接收动作放到一个事务中.同样.也分QueueSession和TopicSession.

8.5 消息的生产者

消息生产者由Session创建,并用于将消息发送到Destination.同样,消息生产者分两种类型:QueueSender和TopicPublisher.可以调用消息生产者的方法(send或publish方法)发送消息.

8.6 消息消费者

消息消费者由Session创建,用于接收被发送到Destination的消息.两种类型:QueueReceiver和TopicSubscriber.可分别通过Session的createReceiver(Queue)或createSubscriber(Topic)来创建.当然,也可以由Session的creatDurableSubscriber方法来创建持久化的订阅者.

8.7 Message

是在消费者和生产者之间传递的对象,消息头,一组消息属性,和一个消息体。

8.8 MessageListener

消息监听器.如果注册了消息监听器,一旦消息到达,将自动调用监听器的onMessage方法.EJB中的MDB(Message-Driven Bean)就是一种MessageListener.

二. 消息队列简介

1. 什么是 MQ

MQ(Message QueueMQ),消息队列中间件,是一个用于消息的接受和转发的容器,可用于消息的推送。很多人都说:MQ 通过将消息的发送和接收分离,从而来实现应用程序的异步和解偶。这个给人的直觉是——MQ 是异步的,用来解耦的,但是这个只是 MQ 的效果而不是目的.MQ 真正的目的是为了通讯,屏蔽底层复杂的通讯协议,定义了一套应用层的、更加简单的通讯协议.

在消息队列中,定义了两个对象——发送数据的叫生产者;接收数据的叫消费者。并且提供了一个 SDK 让我们可以定义自己的生产者和消费者实现消息通讯而无视底层通讯协议.

SpringBoot2.x系列教程59--SpringBoot整合消息队列之JMS简介_应用程序_06

  • Producer:消息生产者,负责产生和发送消息到 Broker;
  • Broker:消息处理中心。负责消息存储、确认、重试等,一般其中会包含多个 queue;
  • Consumer:消息消费者,负责从 Broker 中获取消息,并进行相应处理。

2. MOM消息中间件

消息队列中间件(MOM:Message Orient MiddleWare),将信息以消息的形式,从一个应用程序传输到另一个或者多个应用程序。

消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题。实现高性能,高可用,可伸缩和最终一致性架构,是大型分布式系统不可缺少的中间件。

SpringBoot2.x系列教程59--SpringBoot整合消息队列之JMS简介_Java_07


3. 消息中间件有很多的用途和优点

1️⃣.消息异步接受:类似于手机短信的行为,消息发送者不需要等待消息接受者的响应,减少软件多系统集成的耦合度; 

2️⃣.负责建立网络通信的通道,进行数据的可靠传送,只有接受方接受到消息后才可删除,多个消息也可以组成原子事务;

3️⃣.保证数据不重发,不丢失;

4️⃣.能够实现跨平台操作,能够为不同操作系统上的软件集成技工数据传送服务.

 

标签:订阅,SpringBoot,异步,--,JMS,队列,Session,消息
From: https://blog.51cto.com/u_7044146/5966088

相关文章

  • SpringBoot2.x系列教程61--SpringBoot整合消息队列之ActiveMQ代码实现异步消息传递及
    SpringBoot2.x系列教程61--SpringBoot整合消息队列之ActiveMQ代码实现消息传递作者:一一哥我在上一章节中,给大家介绍了ActiveMQ,本节中我会介绍SpringBoot中如何整合ActiveMQ......
  • SpringBoot2.x系列教程57--SpringBoot中默认缓存实现方案
    SpringBoot2.x系列教程57--SpringBoot中默认缓存实现方案作者:一一哥在上一节中,我带大家学习了在SpringBoot中对缓存的实现方案,尤其是结合SpringCache的注解的实现方案,接下......
  • SpringBoot2.x系列教程56--SpringBoot中的缓存实现方案介绍
    SpringBoot2.x系列教程56--SpringBoot中的缓存实现方案介绍作者:一一哥一.Spring中对缓存的支持1.SpringCache简介从Spring3.1开始,Spring中引入了对Cache的支持。而在Spri......
  • SpringBoot2.x系列教程36--整合SpringMVC之CORS跨域访问处理(上)
    SpringBoot2.x系列教程36--整合SpringMVC之CORS跨域访问处理(上)作者:一一哥一.跨域问题及解决1.什么是跨域访问?JavaScript出于安全方面的考虑,做了一个同源策略的限制,也就......
  • 解决表单action属性传参时值为null的问题
    一.异常重现最近壹哥有个学生在学习Servlet进行Web开发时,尝试着使用表单中的action传递参数,结果他发现在Servlet中无法接收到前端传过来的参数值。我们先来看看他的代码,具......
  • 关于jsjiami.v6加密和解密
    JavaScript解密是指在JavaScript代码被加密之后,使用特定的工具或方法来恢复其原有的可读性。这种技术通常用于对JavaScript代码进行保护,以防止代码被未经授权的人窃取......
  • 冒泡排序
    冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少一个元素移动到它应......
  • 如何理解动态规划
    一、动态规划三板斧状态转移公式循环或递归性能优化二、WHY1、状态转移公式动态规划与分治不一样,分治的问题是相互独立的,而动态规划的各个状态是有关联关系......
  • 初学java懵了,这个异常是怎么产生的?
    一.异常现象最近壹哥的老表开始学Java啦,结果学了还不到两天,就遇到了他解决不了的问题,然后就跑来问我了。不知有没有其他初学java的小伙伴,大家可以过来围观一下,看看下面的问......
  • 对Integer进行等值比较时踩到的一个坑
    一.引言小伙伴们应该都知道,只要我们写代码,必然就会有BUG的存在。所以解决BUG的过程会伴随程序员的一生,这就是一个无解的常态。在平时的学习和工作过程中,我们需要通过不断地实......