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 消息模型
同步请求:浏览器 向服务器 发送一个登录请求,如果服务器 没有及时响应,则浏览器则会一直等待状态,直至服务器响应或者超时. 异步请求:浏览器 向服务器 发送一个登录请求,不管服务器是否立即响应,浏览器 ...
随机推荐
- LeetCode 145. Binary Tree Postorder Traversal二叉树的后序遍历 (C++)
题目: Given a binary tree, return the postorder traversal of its nodes' values. Example: Input: [1,nul ...
- 重拾算法之复杂度分析(大O表示法)
.katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...
- Attention篇(一)
主要是阅读以下博文的总结: https://zhuanlan.zhihu.com/p/31547842 https://www.zhihu.com/question/68482809/answer/2 ...
- [LeetCode] 477. Total Hamming Distance 全部汉明距离
The Hamming distance between two integers is the number of positions at which the corresponding bits ...
- [LeetCode] 367. Valid Perfect Square 检验完全平方数
Given a positive integer num, write a function which returns True if num is a perfect square else Fa ...
- Export failed for github.com/hashicorp/consul: Unable to export source: exit status 128
背景 go项目,使用glide install命令去下载安装依赖,依赖中有个github.com/hashicorp/consul 问题描述 一直无法下载安装依赖成功,报错如下: [ERROR] Ex ...
- Docker笔记:常用服务安装——Nginx、MySql、Redis(转载)
转载地址:https://www.cnblogs.com/spec-dog/p/11320513.html 开发中经常需要安装一些常用的服务软件,如Nginx.MySql.Redis等,如果按照普通的 ...
- 用友U8删除采购转固卡片后,再次转固找不到采购订单,且其他订单转固报错
问题描述 1.用户反馈删除两张之前通过采购转固定资产的卡片后,想要再次生成卡片时候,却找不到这两张卡片. 2.用户尝试对其他未转固定资产的订单进行转固,在保存卡片时提示“本次结转将放弃全部已完成的业务 ...
- PHP 函数禁用设置方法
PHP 函数禁用设置方法先找到php.ini 然后搜索disable_function 直接在上面添加你要禁用的函数就可以了 然后记得重启php-fpm(如果装了php-fpm)
- 【More Effective C++ 条款2】最好使用C++转型操作符
C的转型方式存在以下两个缺点: 1)几乎允许你将任何类型转化为任何类型,不能精确的指明转型意图,这样很不安全 如将一个pointer-to-base-class-object转型为一个pointer- ...