0%

JMS

JMS

Java消息服务(JMS)定义了java中一组创建、发送、接收和读取消息的应用程序接口,是J2EE的消息服务规范,类似于JDBC,使得java程序能够很好地与不同厂商的消息组件进行通信。

消息系统是用来为各个应用程序提供可靠的异步通信服务。解耦合性,发送方的请求发送到消息系统,再由消息系统转发给接收方。

JMS支持两种消息类型PTP和Pub/Sub。

JMS编程模型

一个基本的JMS程序主要由6部分构成

  • 系统管理对象(连接工厂,目标对象) Administered Objects
  • 连接对象(Connection)
  • 会话对象(Session)
  • 消息生产者(Message Producer)
  • 消息消费者(Message Consumer)
  • 消息对象(Message)

系统连接对象

系统连接对象有两部分,连接工厂和目标对象。

连接工厂

连接工厂是客户端创建连接的对象,所有的连接工厂都是QueueConnectionFactory或TopicConnectionFactory接口的实例

目标对象

目标对象是一个对象,客户程序用它指明客户端产生消息的目的地和消费消息的源头。PTP中为队列(queue),pub/sub中为主题(topic)

连接对象

连接对象封装了与JMS消息服务器的虚拟连接。一个连接对象包含了在客户端和服务端一个后台程序之间的打开的TCP/IP连接。

获取到QueueConnectionFactory或TopicConnectionFactory之后,使用createConnection来创建连接

1
connectionFactory.createConnection()

会话对象

会话对象是单线程上下文,可以用来创建消息生产者、消息消费者和消息。

获取到Connection之后使用createQueueSession或createTopicSession来创建

1
2
3
// 第一个参数为是否支持事务处理,第二个参数表示是否自动确认消息
connection.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);
connection.createTopicSession(false,Session.AUTO_ACKNOWLEDGE)

消息生产者

消息生产者有会话对象创建,并发送消息到目标对象(queue或topic),需要实现MessageProducer接口

消息消费者

消息消费者由会话对象创建,用来接收发送到目标对象的消息,需要实现MessageConsumer接口

消息监听者

消息监听者是异步消息事件的处理者,实现了MessageListener接口,该接口只有一个方法onMessage

消息

消息主要由消息头,属性,消息体组成

消费模式

消息队列原理

P2P点对点

PTP是点对点传输消息,是基于queue(队列)的一个拉取或者轮询的消息传送模型,消息生产者发送消息到队列,消息消费者从队列中主动拉取消息,队列的存在,使得消息的异步传输称为可能,P2P模型在点对点的情况下进行消息传递时采用。每个客户端对应一个消息队列,客户端发送消息到对方的消息队列中,从自己的消息队列读取消息。这种模型从队列中请求信息,而不是将消息推送到客户端。这个模型的特点是发送到队列的消息被一个且只有一个接收者接收处理,即使有多个消息监听者也是如此

Pub/Sub

Pub/Sub发布/订阅模型是一个基于推送的消息传送模型,定义了如何向一个内容节点发布和订阅消息,这个内容节点称为topic(主题)**,主题可以认为是消息传递的中介,消息发布者将消息发布到某个主题,而消息订阅者则从主题订阅消息,主题使得消息的订阅者与消息的发布者互相保持独立,不需要进行接触即可保证消息的传递,发布/订阅模型在消息的一对多广播时采用,发布订阅模型可以有多种不同的订阅者**,临时订阅者只在主动监听主题时才接收消息,而持久订阅者则监听主题的所有消息,即使当前订阅者不可用,处于离线状态