JMS基本概念
JMS概念
JMS(Java Message Service)为Java消息服务规范,是一个面向Java平台的消息中间件异步通信服务模型,用于在两个应用程序之间进行通信,或者在分布式系统中发送消息,包括消息的创建、发送和读取等。JMS是一个与平台无关的API,绝大多数中间件(MOM)提供商均提供对JMS的支持。通过JMS消息服务平台,当两个应用系统需要进行消息通信时,他们并不是直接相连的,而是通过一个共同的消息收发服务系统连接起来,这样就可以达到了系统间解耦的目的。
JMS有两种消息传输模式:Point-to-Point(P2P)模型和Publish-Subscribe模型(点对点模型和发布订阅模型)。
点对点(P2P)消息模型
点对点消息模型组成元素包括:消息生产者(Provider)、消息消费者(Consumer)和消息队列(Queue)组成。每一个消息由消息生产者发送给一个特定的消息队列,不同的消息队列具有不同的名称,这个消息队列又被称为消息发送的目的地(Destination),该队列将会保存所有发给他的消息。消息消费者通过设置消息获取源(即从哪一个消息队列中获取消息)从相应的队列中读取消息,这个获取源即时前面所提的目的地(Destination)。
在点对点消息模型中,每一个消息只能被一个消费者消费,当队列中的某一个消息被消费者消费后,该消息立即会被消息服务系统从消息队列中删除。
消息队列中的消息时按照FIFO模型进行存储和消费的,消息具有顺序性,消费者只能按照时间先后顺序消费消息,不能选择消费某一条消息。
点对点消息模型具有以下特征:
- 每个消息只有一个接受者
- 消息发送者和消息接受者并没有时间依赖性
- 当接受者收到消息的时候,会发送确认收到消息通知(acknowledgement)
发布/订阅模型(Publish-SubScribe)
发布/订阅模型组成元素也由三个:消息发布者(Publisher)、消息订阅者(Subscriber)和消息主题(Topic)。在该模型中,发布者将消息发送给一个特定的消息存储目的地(Destination),该目的地在发布/订阅模型中被称作Topic,然后订阅者从该Topic中获取相应的消息。与P2P不同的是,在发送/订阅模型中,一条消息可以被多个订阅者订阅。当一条消息被一个订阅者消费后并不会马上被消息服务系统删除,而是继续存储在Topic中,直到一定的时间后才会被删除。在发布/订阅模式中,当存储消息的文件达到一定的大小时,消息也会被删除。
发布/订阅模型具有以下特征:
- 每个消息可以被多个订阅者订阅
- 发布者和订阅者有时间依赖性,只有当客户端创建订阅后才能接受消息,且订阅者需一直保持活动状态以接收消息
两种接受消息的方式
在JMS中有两种方式供消费者(订阅者)接受消息:
- 主动接受消息:消费者或者消息订阅者通过receive()方法获取消息。使用receive()方法时,消息为到达队列或Topic时,方法会阻塞,直到队列或者Topic中有消息可用。
- 被动接受消息:消费者或者消息订阅者需要注册一个消息监听者MessageListener(),只要Destination中存在消息,JMS服务器会通过调用MessageListener()中的onMessage()方法向消费者或者订阅者传送消息。
JMS消息种类
JMS定义了五种不同的消息正文格式,允许客户发送和接受一些不同形式的数据。五种消息类型分别是:
- StreamMessage : Java原始数据流
- MapMessage : 键值对(key-value)
- TextMessage : 字符串对象
- ObjectMessage : 一个序列化的Java对象
- BytesMessage :字节数据流
JMS编程接口
基于JMS消息服务系统的编程模型主要包括以下几个元素:
- 连接工厂 :ConnectionFactory。客户端通过ConnectionFactory对象连接到JMS服务器,使用该连接,客户端可以与特定的JMS服务器通信。
- 消息存储目的地 :Destination。目的地为消息被发送的地址或者客户端接受消息的来源,JMS提供两种Destination,Queue and Topic,每一个Destination均有一个唯一的名称。
- 连接对象 :Connection。连接对象封装了了客户端与JMS服务器之间的虚拟连接,由ConnectionFactory创建,在程序结束后使用connection.close()方法关闭连接。
- 会话 :Session。Session是一个单线程上下文,用于产生生产者和消费者(或者发布者和订阅者)和消息。
- 消息生产者 : MessageProducer。消息生产者由Session创建,用于向特定的Destination发送Message。
- 消息消费者 : MessageConsumer。消费者由Session创建,用于从特定的Destination接收Message。
- 消息监听者 :MessageListener。MessageListener用于监听Destination中是否存在消息,当Destination中存在消息时,JMS会通过客户端注册的MessageListener对象中的onMessage()方法通知客户端。消费者通过setMessageListener()方法向JMS服务器注册消息监听者。
这几个元素之间的关系如下图所示:
参考文献