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模式,特点如下:

      每个消息只能被一个消费者所消费; 消息的生产者和消费者之间没有时间上的相关性。在生产者生产消息时,无论消费者是否在运行状态,读可以提取。

    2. 发布/订阅模式:简称Pub/Sub模式,特点如下:

      每个消息可以被对个消费者消费;生产者和消费者之间要有时间上的相关性,消费者只有在订阅了一个主题后,才能消费该主题下的消息。JMS规范运行客户端创建持久订阅,这在一定程度上放松了时间相关性的要求。对于持久订阅,如果消息发布时消费端为处于激活状态,也可以在消费端重新激活时重新开始消费。

    3. 在P2P模式中,消息的目的地(Destination)称为队列(Queue),为在Pup/Sub模式中,消息的目的地称为主题(Topic)。

三、基本API

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

四、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_44715918/article/details/88930717