zoukankan      html  css  js  c++  java
  • 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部分组成:

    1. 连接工厂(Connection Factories)和目的地(Destination)
    2. 连接(Connections)
    3. 会话(Sessions)
    4. 消息生产者(Message Producers)
    5. 消息消费者(Message Consumers)
    6. 消息监听者(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创建队列,而发布/订阅模式创建主题。

  • 相关阅读:
    Using Project Custom Properties to replace all end point of test cases
    Jacoco Code coverage with Robotframework Maven pom.xml example
    Jacoco Code coverage with Robotframework
    Test coverage in a multi module Maven project
    如何让linux的history命令显示时间记录
    项目角色职责分配表
    Linux检查哪些thread在占用CPU
    soapui_mockservicerunner_script.sh
    Some api interface link of Soapui
    GlusterFS分布式存储系统
  • 原文地址:https://www.cnblogs.com/ygj0930/p/10921569.html
Copyright © 2011-2022 走看看