消息中间件ActiveMQ 2:从ActiveMQ了解JMS

1、JMS基本概念及适用范围

JMS是什么

JMS是一系列的接口及相关语义的集合,通过这些接口和和其中的方法,JMS客户端如何去访问消息系统,完成创建、发送、接收和读取企业消息系统中消息。

JMS可移植性的关键在于:JMS API是由Sun作为一组接口而提供的。提供了JMS功能的产品是通过提供一个实现这些接口的提供者来做到这一点的。开发人员可以通过定义一组消息和一组交换这些消息的应用程序,建立JMS应用程序,实现异步通讯。
在这里插入图片描述

总的来说:JMS API是Java消息服务中的一系列接口规范。

JMS的规范的好处:
JMS从提出以来,致力于完成如下几个目标:

  • 定义一组消息公用概念和实用工具:所有Java应用程序都可以使用JMS中定义的API去完成消息的创建、接收与发送,任何实现了JMS标准的MOM都可以作为消息的中介,完成消息的存储转发。

  • 最大化消息应用程序的可移植性:MOM提供了有保证的消息发送,应用程序开发人员无需了解远程过程调用(PRC)和网络/通信协议的细节,提供了程序的可移植性。
    最大化降低应用程序与应用系统之间的耦合度。

  • 由于MOM的存在,各个应用程序只关心和MOM之间如何进行消息的接收与发送,而无需关注MOM的另一边,其他程序是如何接收和发送的。

2、JMS的组成结构和特点

JMS 的组成结构如图:
在这里插入图片描述

组成结构:
JMS provider(消息中间件服务器) :指定的是实现JMS接口的消息中间件,也就是我们的MQ服务器。

MQ中间件的落地产品有

  • ActiveMQ
  • RocketMQ
  • RabbitMQ
  • Kafka

JMS producer(消息的生产者):JMS producer: 消息的生产者,创建和发送JMS消息的客户端应用

JMS consumer(消息的消费者):消息消费者,接收和处理JMS消息的客户端。

3、JMS消息的组成

在这里插入图片描述

3.1、JMS定义的消息结构包括三部分:消息头,消息属性,消息体

  1. 消息头:包含属性如下
  • JMS Destination: 定义消息的发送目的地,由生产者端设置,主要有队列Queue和主题Topic,用于标识把消息发送到指定的队列或主题。
  • JMS DeliveryMode: 定义消息的发送模式,由生产者端设置,主要有持久模式和非持久模式,主要用于标识发布/订阅模式下的消息是否持久化。
  • JMS Expiration: 消息过期时间。如果值为0,代表永不过期,过期后消息将被自动清除。默认永不过期。
  • JMS Priority: 消息优先级,值为0-9,0-4是普通消息,5-9是加急消息,并没有严格说2级比1级一定要优先发送,但要求加急的必须优先于普通消息。
  • JMS MessageID: 唯一标识每个消息,由JMS Provider自动生成。
  • JMS Timestatmp: 时间戳,是生产者把消息发送到消息队列的时间。
  • JMS CorrelationID: 由消费者端设置,用来连接到另一消息,典型的应用是在回复消息中使用CorrelationID连接到原消息,用来标明传递的消息与哪个消息有关。
  • JMS ReplyTo: 由消费者端设置,值为一个JMS Destination,可以称为消息回复地址,可以用于希望消费者回传一个消息给生产者的情况。
  • JMS Type:消息类型的识别符,标明消息是什么结构的(有普通文本结构,有map结构),由消费者端设置。
  • JMS Redelivered:标明是否是第一次发送,如果是,那么值为false,反之true。所谓不是第一次发送,指之前发送过,但没有成功签收消息。
  1. 消息属性:开发者自我添加的属性:比如除了消息之外,当我们想让消息携带一些自己定义的数据就可以使用消息属性来做到。
  • JMS定义的属性:这些属性都是以JMSX开头的属性,包括以下属性:
  • JMSXUserID: 发送消息的用户标识
  • JMSXAppID: 发送消息的应用标识
  • JMSXDeliveryCount , JMSXGroupID , JMSXGroupSeq , JMSXProducerTXID , JMSXConsumerTXID , JMSXRevTimestamp , JMSXState
    【这些属性可以通过api来获取:
    Enumeration jmsxPropertyNames = connection.getMetaData().getJMSXPropertyNames();
    JMS供应商特定的属性:这些属性JMS供应商决定,所谓供应商,也就是不同的消息队列。
  1. 消息体:JMS 定义了五种消息体格式,可以使用不同形式发送和接受数据。
  • TextMessage:以普通字符文本格式存储消息,
  • MapMessage:以Map格式存储消息,取的时候也是以key来取。
  • BytesMessage:以字节文本格式存储消息,取到的数据是字节格式的。
  • StreamMessage:以流格式存储消息,取到的数据是流。
  • ObjectMessage:以对象格式来存储消息,取到的数据是一个对象。
    【以什么格式发送消息取决与使用session创建消息的时候创建的是什么消息,同时尽量在使用生产者和消费者的的消息类型一致,也就是说如果生产者发送的是TextMessage类的消息,消费者在接收到message后,需要转换对应的TextMessage类型,在进行处理相应的消息类型。】

3.2 、支持的消息类型:Queue、Topic

接口Destination的子接口类有:Queue和Topic

3.2.1、Queue(PTP式消息传递)

PTP全称点对点,点对点即一方发,一方收。【也就是说一个消息对应的生产者和消费者是唯一的】
在这里插入图片描述
特性

  • 消息只能被消费一次。【当消息发送到某一个目的地的时候,消费者都可以从这个目的地取消息,但每个消息只能被消费一次】
  • 在ActivemMQ中创建的代码是:Queue queue = session.createQueue("tempqueue");
    这里注意下Queue的类型javax.jms.Queue

3.2.2、Topic(PUB/SUB式消息传递)

PUB/SUB中文称为发布/订阅。所谓发布订阅,以“微信公众号”的订阅和发布为栗子,可以发送文章到微信公众号的服务器,然后订阅了这个微信公众号的人都会“收到”这个公众号该文章的推送。这个过程是一点对多点的过程。所以发布订阅模式适用于一些广播消息的情况。
在这里插入图片描述
特性:

  • 是一点对多点的消息广播(一是指一个生产者,多是指多个消费者)。
  • 消息发布订阅有分为非持久订阅和持久订阅。非持久订阅,那么某个时间不在线的客户将不能接收到那个时间发送的消息。持久订阅会把那时不在线的客户进行标记,等到客户上线的时候会重新发送。
  • 在ActivemMQ中创建的代码是:Topic topic = session.createTopic(TOPIC_NAME);

猜你喜欢

转载自blog.csdn.net/Hicodden/article/details/112001302
今日推荐