ActiveMQ详解(2)——JMS基本概念

ActiveMQ详解(2)——JMS基本概念

一. JMS简介

  • JMS:Java Message Service,Java消息服务,是JavaEE的技术之一。JMS中定义了Java语言访问消息中间件的接口,但是并没有提供具体的实现。实现了JMS接口的消息中间件成为JMS Provider,ActiveMQ就是其中典型的、优秀的实现者。由于ActiveMQ的操作中涉及到了众多JMS相关的概念,因此本节对JMS基本概念进行详细介绍。

二. JMS基本概念

  • JMS Provider:实现了JMS规范和接口的消息中间件。

  • JMS Message:JMS的消息,由以下3部分构成:

    1. 消息头:每个消息头字段都有相应的getter和setter;
    2. 消息属性:如果需要出了消息头字段以外的值,那么可以使用消息属性;
    3. 消息体:封装具体的消息数据。
  • JMS Producer:消息生产者,创建和发送JMS消息的客户端应用。

  • JMS Consumer:消息消费者,接收和处理JMS消息的客户端应用。

    消息的消费有两种方式:

    1. 同步消费:通过调用消费者的receive方法从目的地中显式提取消息,receive方法可以一直阻塞知道消息到达;
    2. 异步消费:客户端程序可以为消费者注册一个消息监听器,以定义当消息到达时的处理逻辑。
  • JMS Domains:消息传递域。JMS中定义了两种消息传递域:点对点模式和发布订阅模式。

    1. 点对点模式:简称P2P模式,特点如下:
      1. 每个消息只能被一个消费者所消费;
      2. 消息的生产者和消费者之间没有时间上的相关性。在生产者生产消息时,无论消费者是否在运行状态,都可以提取消息。
    2. 发布/订阅模式:简称Pub/Sub模式,特点如下:
      1. 每个消息可以被多个消费者所消费;
      2. 生产者和消费者之间要有时间上的相关性,消费者只有在订阅了一个主题之后,才能消费该主题下的消息。JMS规范运行客户端创建持久订阅,这在一定程度上放松了时间相关性的要求。对于持久订阅,如果消息发布时消费端未处于激活状态,也可以在消费端重新激活时重新开始消费。
    3. 在P2P模式中,消息的目的地(Destination)称为队列(Queue),而在Pub/Sub模式中,消息的目的地成为主题(Topic)。

三. 基本API

  1. ConncetionFactory:连接工厂,用来创建连接对象,以连接到JMS Provider。
  2. Connection:封装了JMS客户端程序和Provider之间的一个连接。
  3. Session:会话对象,生产和消费消息的单线程上下文,用于创建生产者、消费者和消息对象等。Session对象提供了一个事务性的上下文,在这个上下文中,一组发送和接收操作被组合到了一个原子操作中。
  4. Destination:消息发送的目的地,有Queue和Topic两种实现类型。
  5. Acknowledge:消息的签收。
  6. Transaction:消息的事务。

四. JMS的消息结构

JMS 规范规定了消息包含三个部分:消息头、消息体和消息属性。

  1. 消息头:包含消息的识别信息和路由信息,主要属性如下:

    1. Destination:消息发送的目的地,主要指Topic或Queue。
    2. DeliveryMode:传送模式,有持久化模式和非持久化模式。一条持久化的消息应该被传递”一次且仅仅一次”,这意味着如果JMS Provider出现了故障,持久化的消息也不会丢失,会在Provider恢复后被重新消费。一条非持久化的消息最多被消费一次,Provider故障时该消息可能会丢失。
    3. Expiration:消息的过期时间。设为0表示该消息永远生效。如果在消息发送后,在过期时间到达后还没有被消费,则该消息会被清除。
    4. Priority:消息优先级,有0~9共10个级别,其中0~4是普通消息,5~9是加急消息。JMS规范不要求Provider严格按照10个优先级的顺序发送消息,但是必须保证加急消息先于普通消息到达。默认优先级为4。
    5. MessageID:识别每个消息的唯一标识,由JMS Provider产生。
    6. Timestamp:JMS Provider在调用send()方法时自动设置,它是消息被发送和实际消费之间的时间差。
    7. ReplyTo:提供本消息的回执消息的目的地址,可在发送一个消息后指定回执发往的目的地,由开发者设置。
    8. Type:消息类型,由开发者设置。
    9. Redelivered:重传标志。如果消息的Redelivered属性为true,表示该消息已经被某个消费者接收过,但是并没有签收(acknowledge)。
  2. 消息体:JMS API定义了5种消息体格式,也称为消息类型,可以使用不同的形式来发送和接收消息,并可以兼容现有的消息格式。5种消息类型如下:

    1. TextMessage
    2. MapMessage
    3. BytesMessage
    4. StreamMessage
    5. ObjectMessage
  3. 消息属性:JMS主要包含以下三种类型的属性:

    1. 应用程序设置的属性,如message.setStringProperty(“key”,”value”);
    2. JMS定义的属性,以”JMSX”作为前缀,封装在消息的元数据中。可使用connection.getMetaData().getJMSXPropertyNames()方法获取所有JMSX的属性名。
    3. JMS Provider的特定属性。

猜你喜欢

转载自blog.csdn.net/weixin_34452850/article/details/82292044