Java JMS——消息服务
转载请注明原文地址: https://www.cnblogs.com/ygj0930/p/10921569.html
一:什么是Java消息服务—— 消息通信接口规范
Java消息服务指的:两个应用程序之间进行异步通信的API,它为标准消息协议和消息服务提供了一组通用接口,包括创建、发送、读取消息等。
二:为什么要用JMS
当大并发时,业务逻辑无法同时处理这么多同时发生的请求,但是客户端又不可能一直阻塞等待后台处理完。因此就需要将 请求的送达 与 业务逻辑处理 解耦,“延时处理”。
举个例子:
电商平台搞秒杀活动时,大家都争先恐后地去抢同一件商品,其过程是:用户发送购买请求后,服务器接到请求,向消息队列发送一个购买消息并立刻返回“订单正在处理”的结果给客户避免客户等待。
而订单服务[处理订单的业务逻辑]则不停的从消息队列中取出消息,按照自己的节奏去处理订单,并将结果返回对应客户端。
这样做可以有效避免高并发时造成业务系统瘫痪的情况。
三:JMS的使用场景
JMS一般适用于Web场景下的高并发处理。
而对于ToB场景下,如企业ERP系统,则基本不会用到。
因为ToC业务链条简单,业务结果可以允许轻微的延迟送达,不影响用户的最终结果。
而企业系统流程长,环环相扣,每个环节都必须执行完才能走下一步业务,这种情况下消息队列的使用反而会造成业务混乱。
四:JMS的优势
1、异步处理
2、可靠传递:JMS保证消息只会递送一次。
五:JMS消息传送模型
1、点对点传输模型——适合于只有一个业务处理程序的场景

此模型由:消息发送者、消息队列、消息接收者[处理者] 组成。
- 每个消息只有一个接收者;
- 消息发送者和接收者并没有时间依赖性,互不可见。
- 当消息发送者发送消息的时候,无论接收者程序在不在运行,都能获取到消息;
- 当接收者收到消息的时候,会发送确认收到通知(acknowledgement)。
2、发布订阅 模型

此模型由 消息发送者、主题、多个订阅者 组成。
topic主要用于保存和传递消息,且会一直保存消息直到消息被传递给客户端。
- 一个消息可以传递给多个订阅者
- 发布者和订阅者有时间依赖性,只有当客户端创建订阅后才能接受消息,且订阅者需一直保持活动状态以接收消息。
为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。
六:JMS消息接收方式
1、同步接收
消息订阅者调用receive()方法。在receive()中,消息未到达或在到达指定时间之前,该方法会一直阻塞,直到有消息到来。
2、异步接收
消息订阅者需注册一个消息监听者,类似于事件监听器,只要消息到达,JMS服务提供者会通过调用监听器的onMessage()来处理消息。
七:JMS编程接口组成
JMS提供了一系列消息服务的处理规范,由以下6部分组成:
- 连接工厂(Connection Factories)和目的地(Destination)
- 连接(Connections)
- 会话(Sessions)
- 消息生产者(Message Producers)
- 消息消费者(Message Consumers)
- 消息监听者(Message Listeners)

八:JMS的消息组成
JMS消息由三部分组成:
1、消息头——用于匹配
JMS消息头预定义了若干字段用于客户端与JMS提供者之间识别和发送消息,预编译头如下:
– JMSDestination
– JMSDeliveryMode
– JMSMessageID
– JMSTimestamp
– JMSCorrelationID
– JMSReplyTo
– JMSRedelivered
– JMSType
– JMSExpiration
– JMSPriority
2、消息属性
我们可以给消息设置自定义属性,这些属性主要是提供给应用程序的。对于实现消息过滤功能,消息属性非常有用,JMS API定义了一些标准属性,JMS服务提供者可以选择性的提供部分标准属性。
3、消息体
JMS API定义了五种类型的消息格式:
Text message : javax.jms.TextMessage,表示一个文本对象。
Object message : javax.jms.ObjectMessage,表示一个JAVA对象。
Bytes message : javax.jms.BytesMessage,表示字节数据。
Stream message :javax.jms.StreamMessage,表示java原始值数据流。
Map message : javax.jms.MapMessage,表示键值对。
九:JMS的实现——ActiveMQ
上面JMS的两种模型中提到,消息服务的场景主要包括:生产者、消费者、消息队列、主题。
其中,消息生产者 和 消息消费者 分别是两个微服务,一个负责接收请求生成消息,另一个负责提取消息进行业务处理。
而中间作为消息容器的 队列、主题,则是由JMS的实现厂商提供的软件实现,例如:ActiveMQ。
Activemq是一个软件,一个消息服务器。我们的程序作为生产者和消费者,当ActiveMQ启动起来,并配着好host以及相关协议后,即可在我们的程序中,连接到该台服务器,创建连接并发送/获取消息了。
十:JMS编程步骤
发送消息:
(1)、创建连接使用的工厂类JMS ConnectionFactory
(2)、使用管理对象JMS ConnectionFactory建立连接Connection,并启动
(3)、使用连接Connection 建立会话Session
(4)、使用会话Session和管理对象Destination创建消息生产者MessageSender
(5)、使用消息生产者MessageSender发送消息
接受消息:
(1)、创建连接使用的工厂类JMS ConnectionFactory
(2)、使用管理对象JMS ConnectionFactory建立连接Connection,并启动
(3)、使用连接Connection 建立会话Session
(4)、使用会话Session和管理对象Destination创建消息接收者MessageReceiver
(5)、使用消息接收者MessageReceiver接受消息,需要用setMessageListener将MessageListener接口绑定到MessageReceiver消息接收者必须实现了MessageListener接口,需要定义onMessage事件方法。

十一:实战例子
JMS点对点消息传送实现参考:https://www.cnblogs.com/chenpi/p/5565618.html
JMS发布/订阅模型实现参考:https://www.cnblogs.com/chenpi/p/5566983.html
点对点传送 与 发布/订阅模式 的实现区别:
点对点通过session创建队列,而发布/订阅模式创建主题。
Java JMS——消息服务的更多相关文章
- 消息中间件--ActiveMQ&JMS消息服务
### 消息中间件 ### ---------- **消息中间件** 1. 消息中间件的概述 2. 消息中间件的应用场景 * 异步处理 * 应用解耦 * 流量削峰 * 消息通信 --------- ...
- java JMS消息队列
http://blog.csdn.net/shirdrn/article/details/6362792 http://haohaoxuexi.iteye.com/blog/1893038 http: ...
- 三:JMS消息服务规范
一:JMS是什么?--->JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API--->用于在两个应用程 ...
- JBoss EAP应用服务器部署方法和JBoss 开发JMS消息服务小例子
一.download JBoss-EAP-6.2.0GA: http://jbossas.jboss.org/downloads JBoss Enterprise Application Platfo ...
- 【转载】JAVA消息服务JMS规范及原理详解
转载:https://www.cnblogs.com/molao-doing/articles/6557305.html 作者: moyun- 一.简介 JMS即Java消息服务(Java Messa ...
- JAVA消息服务JMS规范及原理详解
JAVA消息服务JMS规范及原理详解 一.简介 JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应 ...
- java jms
这篇博文我们主要介绍J2EE中的一个重要规范JMS,因为这个规范在企业中的应用十分的广泛,也比较重要,我们主要介绍JMS的基本概念和它的模式,消息的消费以及JMS编程步骤. 基本概念 JMS是java ...
- Intellij IDEA 创建消息驱动Bean - 接收JMS消息
除了同步方式的调用之外,有时还需要异步调用,用来处理不需要即时处理的信息,例如短信.邮件等,这需要使用EJB中的独特组件——消息驱动Bean(Message-Driven Bean,MDB),它提供了 ...
- ActiveMQ( 一) 同步,异步,阻塞 JMS 消息模型
同步请求:浏览器 向服务器 发送一个登录请求,如果服务器 没有及时响应,则浏览器则会一直等待状态,直至服务器响应或者超时. 异步请求:浏览器 向服务器 发送一个登录请求,不管服务器是否立即响应,浏览器 ...
随机推荐
- 权限维持:Win2008以上的iis
参考文章:https://mp.weixin.qq.com/s/z1d3yvp14GWakyonTh_b8A 浅谈原理 在 .Net 中,HttpModule 其实就是实现了 IHttpModule ...
- 使用ES6 Class封装的IndexDB 操作类,并实现模糊搜索
封装如下: indexDBOperate.js export class IndexDBOperate { db = null // 数据库实例 databaseName = null // 数据库 ...
- [ Python入门教程 ] Python基础语法
Python的语法非常简练,因此用Python编写的程序可读性强.容易理解.本章将介绍Python的基本语法和概念. Python文件类型 1.源代码.Python的源代码的扩展名以py结尾,可直接运 ...
- 守护进程--Supervisor
01,介绍 02,安装部署 yum install python-setuptoolseasy_install supervisor 03,使用说明 supervisor安装成功之后,没有提供默认的配 ...
- .NET Core:Token认证
现在是WebAPI的时代,你所需要面对的不止是浏览器了,通常会使用Web, WebApp, NativeApp等多种呈现方式.其中诸如Ember,Angular,Backbone之类的前端框架类库正随 ...
- Java连载15-boolean类型&类型转换&++运算符
一.boolean类型 1.说明: (1)在java语言中,boolean类型只有两个值:true.false,没有其他的值.在C语言中,是有0代表false和1代表true的 (2)在底层存储的时候 ...
- BCompare注册文件+密钥被撤销解决方案
注册码: rssAPVg2OpBjDVo3E0DhGWrjPIq0hsTSuNz13wTuzVHfb2mRgO9bZKn9Bl42D5YEyMSYPXsxzcb08dqbRlbzWNJzJXE6YVa ...
- java,string和list,list和set相互转换
list转string String str= String.join("','", list); list转set Set<String> set = new Has ...
- Salesforce学习之路(二)Profile
如上篇文章所述,针对User来讲,最重要的概念便是Profile和Role,因为Profile于Security息息相关,这是一个合格的产品中十分重要的一环. 何为Profile? 前文所讲--就是一 ...
- 【MySQL】binlog2sql
binlog2sql 1.安装 shell> git clone https://github.com/danfengcao/binlog2sql.git && cd binlo ...