一篇文章理解JMS

来源:互联网 发布:人工智能试题及答案 编辑:程序博客网 时间:2024/06/13 21:18

JMS

JMS是什么

  • JMS Java Message Service Java消息服务。是JAVA EE中的一个技术,JMS定义了JAVA中访问消息中间件的接口。类似JDBC。定义了接口,并不具体实现。实现JMS接口消息的中间件称为JMS Provider.例如:ActiveMQ.

JMS基本概念

JMS Message

  • JMS Message JMS消息,JMS消息由三部分组成
    1.消息头:每个消息头都有对应的setter、getter方法。
    2.消息属性:如果需要除消息头以外的值,可以使用消息属性。
    3.消息体: 封装具体的消息数据。

JMS producer

  • JMS Producer: 消息生产者,创建和发送JMS Message的客户端应用。

JMS consumer

  • JMS Consumer: 消息消费者,接收和处理JMS Message的客户端应用。消息的消费可以采取以下两种消费方式。
    1.同步消费: 通过调用消费者的receive方法从目的地中显示的提取消息,receive方法会一直阻塞,知道消息到达。
    2.异步消费: 通过为消费者注册一个消息监听器,定义消息到达时采取的动作。

JMS domains

  • JMS domains: 消息传递域。也可以理解为消息传递的方式。JMS规范中定义了两种消息传递的机制,点对点(point-to-point, 简写PTP)和发布/订阅(publish/subscribe,简写pub/sub).
    1.PTP的特点如下:
    (1) 每个消息只能有一个消费者。PTP目的地被称为队列(Queue)。
    (2) 消费者和生产者之间没有时间相关性。也就是说消息生产者不管消费者是否处于运行状态都可以发送消息,而消费者也可以不管生产者是否在线都可以接收消息。
    这里写图片描述
    2.pub/sub 特点。
    (1) 每个消息可以有多个消费者。生产者把消息发布到一个“主题”上。
    (2) 生产者和消费者之间有时间相关性。也就是说,消费者只能消费它订阅的主题之后,主题发布的消息。而且如果没有进行持久订阅,那么消费者只能消费在线时生产者发布的消息。JMS规范允许进行持久订阅。一定程度上减少了时间的相关性。pub/sub目的地被称为主题(Topic)
    这里写图片描述

Connection Factory

  • connection factory:连接工厂,用来创建连接到JMS Provider连接对象。

JMS Connection

  • connection:连接对象。封装了客户与JMS Provider的一个虚拟连接。

JMS Session

  • session:生产和消费消息的一个单线程上下文。会话用于创建生产者、消费者、目的地、消息等,会话提供了一个事物性的上下文,在会话中,一组发送和接收消息被组合到一个操作中。

Destination

  • destination:消息发送和接收的目的地。

JMS Client

  • client:用来接收消息的应用。

JMS消息结构

  • JMS Message 由消息头,消息属性,消息体三部分组成。

消息头

  • 消息头包含消息的识别信息和路由信息,消息头的一些标准属性如下:
    1.JMSDestination:消息发送目的地,由Send方法设置,主要指点对点中的Queue与pub/sub中的Topic,自动分配。
    2.JMSDeliveryMode:传送模式,传送模式分为如下两种:
    (1) 持久模式:一条持久性的消息应该被传送“一次仅仅一次”。一次就是这个消息一定会被传递一次。例如JMS提供者出现故障,那么在恢复之后这条消息不会丢失,会再次被传递,直到成功。仅仅一次,就只要传递成功就不会再次被传递。
    (2) 非持久模式:一条非持久的消息“最多被传送一次“。最多一次意味着这条消息有可能丢失。如服务器故障,恢复后次消息会被丢失。
    3.JMSExpiration:由Send方法设置。消息过期时间。默认为永久不过期。
    4.JMSPriority:消息优先级,等级从0-9.默认为4.数值越大,优先级越高。
    5.JMSMessageID:唯一识别每个消息的标志。由JMS Provider产生,自动分配。
    6.JMSTimestamp:JMS Provider调用Send方法时候自动设置,是消息被返送和消息被消费之间的实际时间差。
    7.JMSCorrelationID:用来连接到另外一个消息。典型的应用就是在回复消息中连接到原消息。JMSCorrelationID可以由开发者设置称为任何值。
    8.JMSReplyTo: 提供本消息回复消息的目的地地址。由开发者设置。
    9.JMSType: 消息类型识别符,由开发者设置。
    10.JMSRedelivered:这个有两个值,true或者false。如果为true说明这条消息被客户端收到过,但是因为某种原因没有被签收。

消息属性

  • 消息属性包含三种类型:
    1.应用程序添加的属性。如:message.setStringProperty(“userName”,”张三”);
    2.JMS定义的属性。使用”JMSX”作为属性的前缀名。
    3.JMS供应商定义的属性。

消息体

 - JMS API定义了5中形式的消息体,也可以理解为5中消息类型。TextMessage、MapMessage、BytesMessage、StreamMessage、ObjectMessage.

JMS的可靠性机制

  • 消息确认
    JMS消息只有被确认之后,才能认为被成功的消费了。一般消息被成功消费分三个步骤,客户接受消息,处理消息,确认消息。消息何时被确认取决于创建会话时的应答模式。应答模式有三种:
    1.Session.AUTO_ACKNOWLEDGE:客户从receive方法成功返回,或者从MessageListener.onMessage方法成功返回时候,会话自动确认客户收到消息。
    2.Session_CLIENT_ACKNOWLEDGE:客户通过调用acknowledge方法确认消息。这个确认是会话级别的确认。也就是说只要确认一个被消费消息,那么这个会话上的所有被消费的消息都会被确认。
    3.Session_DUPS_ACKNOWLEDGE:会话迟钝的确认消息。选择这个模式有可能出现重复的消息。JMSRedelivered会是true.

  • 消息持久性
    JMS支持两种消息提交模式:
    1.PERSISTENT:持久模式。
    2.NON_PERSISTENT:非持久模式。这个两种模式上面有介绍。

  • 消息优先级
    消息优先级,等级从0-9.默认为4.数值越大,优先级越高。

  • 消息过期
    消息过期时间。默认为永久不过期。

  • 持久订阅
    持久订阅,首先消息的生产者必须使用持久模式提交信息,消费者可以通过createDurableSubscriber方法来创建一个持久订阅。持久订阅在某一个时刻只能有一个激活的订阅者。持久订阅创建之后会一直保存,直到应用程序在会话上调用unsubcribe方法。

  • 本地事物
    JMS session提供了commit与rollback方法来控制事物。事物提交意味着生产的所有消息被提交,消费的所有消息被确认。回滚意味着生产的所有消息被销毁,消费的所有消息被恢复并重新提交,除非它们过期。

JMS的API结构

这里写图片描述

JMS应用的基本步骤

  1. 创建Connection Factory
  2. 通过factory创建Connection。
  3. 启动Connection
  4. 通过Connection创建JMS Session
  5. session创建destination
  6. session 创建producer 并设置destination。
  7. session创建consumer,设置目的地。或者注册一个JMS Message listener.
  8. 发送或者接受Message(s)
  9. 关闭所有JMS资源。