转载请注明原文地址: http://www.javashuo.com/article/p-wqhrlhmn-et.htmlhtml
Java消息服务指的:两个应用程序之间进行异步通讯的API,它为标准消息协议和消息服务提供了一组通用接口,包括建立、发送、读取消息等。java
当大并发时,业务逻辑没法同时处理这么多同时发生的请求,可是客户端又不可能一直阻塞等待后台处理完。所以就须要将 请求的送达 与 业务逻辑处理 解耦,“延时处理”。web
举个例子:编程
电商平台搞秒杀活动时,你们都争先恐后地去抢同一件商品,其过程是:用户发送购买请求后,服务器接到请求,向消息队列发送一个购买消息并马上返回“订单正在处理”的结果给客户避免客户等待。服务器
而订单服务[处理订单的业务逻辑]则不停的从消息队列中取出消息,按照本身的节奏去处理订单,并将结果返回对应客户端。session
这样作能够有效避免高并发时形成业务系统瘫痪的状况。并发
JMS通常适用于Web场景下的高并发处理。异步
而对于ToB场景下,如企业ERP系统,则基本不会用到。微服务
由于ToC业务链条简单,业务结果能够容许轻微的延迟送达,不影响用户的最终结果。高并发
而企业系统流程长,环环相扣,每一个环节都必须执行完才能走下一步业务,这种状况下消息队列的使用反而会形成业务混乱。
一、异步处理
二、可靠传递:JMS保证消息只会递送一次。
一、点对点传输模型——适合于只有一个业务处理程序的场景
此模型由:消息发送者、消息队列、消息接收者[处理者] 组成。
二、发布订阅 模型
此模型由 消息发送者、主题、多个订阅者 组成。
topic主要用于保存和传递消息,且会一直保存消息直到消息被传递给客户端。
为了缓和这样严格的时间相关性,JMS容许订阅者建立一个可持久化的订阅。这样,即便订阅者没有被激活(运行),它也能接收到发布者的消息。
一、同步接收
消息订阅者调用receive()方法。在receive()中,消息未到达或在到达指定时间以前,该方法会一直阻塞,直到有消息到来。
二、异步接收
消息订阅者需注册一个消息监听者,相似于事件监听器,只要消息到达,JMS服务提供者会经过调用监听器的onMessage()来处理消息。
JMS提供了一系列消息服务的处理规范,由如下6部分组成:
JMS消息由三部分组成:
JMS消息头预约义了若干字段用于客户端与JMS提供者之间识别和发送消息,预编译头以下:
– JMSDestination
– JMSDeliveryMode
– JMSMessageID
– JMSTimestamp
– JMSCorrelationID
– JMSReplyTo
– JMSRedelivered
– JMSType
– JMSExpiration
– JMSPriority
咱们能够给消息设置自定义属性,这些属性主要是提供给应用程序的。对于实现消息过滤功能,消息属性很是有用,JMS API定义了一些标准属性,JMS服务提供者能够选择性的提供部分标准属性。
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的两种模型中提到,消息服务的场景主要包括:生产者、消费者、消息队列、主题。
其中,消息生产者 和 消息消费者 分别是两个微服务,一个负责接收请求生成消息,另外一个负责提取消息进行业务处理。
而中间做为消息容器的 队列、主题,则是由JMS的实现厂商提供的软件实现,例如:ActiveMQ。
Activemq是一个软件,一个消息服务器。咱们的程序做为生产者和消费者,当ActiveMQ启动起来,并配着好host以及相关协议后,便可在咱们的程序中,链接到该台服务器,建立链接并发送/获取消息了。
发送消息:
(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点对点消息传送实现参考:http://www.javashuo.com/article/p-crgipmbt-db.html
JMS发布/订阅模型实现参考:http://www.javashuo.com/article/p-tldymjvc-kd.html
点对点传送 与 发布/订阅模式 的实现区别:
点对点经过session建立队列,而发布/订阅模式建立主题。