Java JMS——消息服务

 

转载请注明原文地址: http://www.javashuo.com/article/p-wqhrlhmn-et.htmlhtml

 

一:什么是Java消息服务—— 消息通讯接口规范

  Java消息服务指的:两个应用程序之间进行异步通讯的API,它为标准消息协议和消息服务提供了一组通用接口,包括建立、发送、读取消息等。java

 

二:为何要用JMS

  当大并发时,业务逻辑没法同时处理这么多同时发生的请求,可是客户端又不可能一直阻塞等待后台处理完。所以就须要将 请求的送达 与 业务逻辑处理 解耦,“延时处理”web

  举个例子:编程

  电商平台搞秒杀活动时,你们都争先恐后地去抢同一件商品,其过程是:用户发送购买请求后,服务器接到请求,向消息队列发送一个购买消息并马上返回“订单正在处理”的结果给客户避免客户等待。服务器

  而订单服务[处理订单的业务逻辑]则不停的从消息队列中取出消息,按照本身的节奏去处理订单,并将结果返回对应客户端。session

 

  这样作能够有效避免高并发时形成业务系统瘫痪的状况。并发

 

三:JMS的使用场景

  JMS通常适用于Web场景下的高并发处理。异步

  而对于ToB场景下,如企业ERP系统,则基本不会用到。微服务

  由于ToC业务链条简单,业务结果能够容许轻微的延迟送达,不影响用户的最终结果。高并发

  而企业系统流程长,环环相扣,每一个环节都必须执行完才能走下一步业务,这种状况下消息队列的使用反而会形成业务混乱。

 

四:JMS的优点

  一、异步处理

  二、可靠传递:JMS保证消息只会递送一次。

 

五:JMS消息传送模型

 一、点对点传输模型——适合于只有一个业务处理程序的场景

  

  此模型由:消息发送者、消息队列、消息接收者[处理者] 组成。

  • 每一个消息只有一个接收者;
  • 消息发送者和接收者并无时间依赖性,互不可见。
  • 当消息发送者发送消息的时候,不管接收者程序在不在运行,都能获取到消息;
  • 当接收者收到消息的时候,会发送确认收到通知(acknowledgement)。

     

  二、发布订阅 模型

  

  此模型由 消息发送者、主题、多个订阅者 组成。

  topic主要用于保存和传递消息,且会一直保存消息直到消息被传递给客户端。

  • 一个消息能够传递给多个订阅者
  • 发布者和订阅者有时间依赖性,只有当客户端建立订阅后才能接受消息,且订阅者需一直保持活动状态以接收消息。
  • 为了缓和这样严格的时间相关性,JMS容许订阅者建立一个可持久化的订阅。这样,即便订阅者没有被激活(运行),它也能接收到发布者的消息。

 

六:JMS消息接收方式

  一、同步接收

  消息订阅者调用receive()方法。在receive()中,消息未到达或在到达指定时间以前,该方法会一直阻塞,直到有消息到来。

 

  二、异步接收

  消息订阅者需注册一个消息监听者,相似于事件监听器,只要消息到达,JMS服务提供者会经过调用监听器的onMessage()来处理消息。

 

七:JMS编程接口组成

  JMS提供了一系列消息服务的处理规范,由如下6部分组成:

  1. 链接工厂(Connection Factories)和目的地(Destination)
  2. 链接(Connections)
  3. 会话(Sessions)
  4. 消息生产者(Message Producers)
  5. 消息消费者(Message Consumers)
  6. 消息监听者(Message Listeners)

 

八:JMS的消息组成

   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的实现——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点对点消息传送实现参考:http://www.javashuo.com/article/p-crgipmbt-db.html

  JMS发布/订阅模型实现参考:http://www.javashuo.com/article/p-tldymjvc-kd.html

 

  点对点传送 与 发布/订阅模式 的实现区别:

  点对点经过session建立队列,而发布/订阅模式建立主题。