JMS简单介绍

1、JMS 介绍


Java Message Service(JMS)是 SUN 提出的旨在统一各种 MOM(Message-Oriented Middleware )系统接口的规范,它包含点对点(Point to Point,PTP)和发布 / 订阅(Publish/Subscribe,pub/sub)两种消息模型,提供可靠消息传输、事务和消息过滤等机制。



简单的说,JMS 制定了一个发消息的规范。是一个与具体平台无关的 API,绝大多数 MOM 提供商都对 JMS 提供支持,ActiveMQApache出品的开源项目,它是JMS规范的一个实现。




2、JMS 的作用




在不同应用之间进行通信或者从一个系统传输数据到另外一个系统。两个应用程序之间,或分布式系统中发送消息,进行异步通信。



这类问题有很多解决方案 , 比如 DB、SOA、Socket 通信、RMI, 等,但我们需要根据项目的限制以及功能和性能的需要作出选择。



JMS 的应用场景:规模和复杂度较高的分布式系统。





    1. 同步通信:客户发出调用后,必须等待服务对象完成处理并返回结果后才能继续执行;


    2. 客户和服务对象的生命周期紧密耦合:客户进程和服务对象进程都必须正常运行;如果由于服务对象崩溃或者网络故障导致客户的请求不可达,客户会接收到异常;


    3. 点对点通信:客户的一次调用只发送给某个单独的目标对象。









MOM 在系统中的位置:








3、JMS 模型




Java 消息服务应用程序结构支持两种模型:



1、点对点模型 (基于队列)



每个消息只能有一个消费者。消息的生产者和消费者之间没有时间上的相关性. 可以由多个发送者,但只能被一个消费者消费。




  • 一个消息只能被一个接受者接受一次


  • 生产者把消息发送到队列中 (Queue),这个队列可以理解为电视机频道 (channel)


  • 在这个消息中间件上有多个这样的 channel


  • 接受者无需订阅,当接受者未接受到消息时就会处于阻塞状态



2、  发布者 / 订阅者模型(基于主题的)



每个消息可以有多个消费者。生产者和消费者之间有时间上的相关性。订阅一个主题的消费者只能消费自它订阅之后发布的消息.






  • 允许多个接受者,类似于广播的方式


  • 生产者将消息发送到主题上 (Topic)


  • 接受者必须先订阅





注: 持久化订阅者:特殊的消费者,告诉主题,我一直订阅着,即使网络断开,消息服务器也记住所有持久化订阅者,如果有新消息,也会知道必定有人回来消费。







3.1、JMS 消息发送模式










    3.2、Topic 发送模式












      3.3、 JMS 公共接口






JMS 公共




点对点域




发布/订阅域




ConnectionFactory




 QueueConnectionFactory




TopicConnectionFactory




Connection




 QueueConnection




TopicConnection




Destination




 Queue




Topic




Session




 QueueSession




TopicSession




MessageProducer




 QueueSender




TopicPublisher




MessageConsumer




 QueueReceiver




TopicSubscriber







4、JMS 的基本构件




连接工厂:



  连接工厂是客户用来创建连接的对象,例如 ActiveMQ 提供的 ActiveMQConnectionFactory。




  连接: JMS Connection 封装了 JMS 客户端到 JMS Provider 的连接与 JMS 提供者之间的一个虚拟的连接。



  会话: JMS Session 是生产和消费消息的一个单线程上下文。会话用于创建




消息的生产者(producer),消费者(consumer),消息(message)等,会话, 是一个事务性的上下文。



消息的生产和消费不能包含在同一个事务中。






生产者:MessageProducer   由 Session 对象创建的用来发送消息的对象



消费者:MessageConsumer  由 Session 对象创建的用来发送消息的对象




消息:Message jms 消息包括消息头和消息体以及其它的扩展属性。



JMS 定义的消息类型有 TextMessage、MapMessage、BytesMessage、



StreamMessage 和 ObjectMessage。



目的地:Destination,消息的目的地,是用来指定生产的消息的目标和它消费的消息的来源的对象。




消息队列:Queue 点对点的消息队列



消息主题:Tipic 发布订阅的消息队列







5、JMS 消息发送时序图















6、JMS 消息发送开发流程





1、生产者(producer)开发流程(ProducerTool.java):





    •  创建 Connection:


    • 根据 url,user 和 password 创建一个 jms Connection。


    • 创建 Session:


    • 在 connection 的基础上创建一个 session,同时设置是否支持事务和 ACKNOWLEDGE 标识。


    • 创建 Destination 对象:


    • 需指定其对应的主题(subject)名称,producer 和 consumer 将根据 subject 来发送 / 接收对应的消息。


    • 创建 MessageProducer:


    • 根据 Destination 创建 MessageProducer 对象,同时设置其持久模式。


    • 发送消息到队列(Queue):


    • 封装 TextMessage 消息,使用 MessageProducer 的 send 方法将消息发送出去。




2、消费者(consumer)开发流程(ConsumerTool.java):





    • 实现 MessageListener 接口:


    • 消费者类必须实现 MessageListener 接口,然后在 onMessage() 方法中监听消息的到达并处理。


    • 创建 Connection:


    • 根据 url,user 和 password 创建一个 jms Connection,如果是 durable 模式,还需要给 connection 设置一个 clientId。


    • 创建 Session 和 Destination:


    • 创建 replyProducer【可选】:


    • 可以用来将消息处理结果发送给 producer。


    • 创建 MessageConsumer:


    • 根据 Destination 创建 MessageConsumer 对象。


    • 消费 message:


    • 在 onMessage() 方法中接收 producer 发送过来的消息进行处理,并可以通过 replyProducer 反馈信息给 producer









7、JMS 消息订阅者流程图


















8、JMS 消息的事务




1. 创建事务 createSession(paramA,paramB);




paramA 是设置事务的,paramB 设置 acknowledgment mode(应答模式)



paramA 设置为 false 时:paramB 的值可为 Session.AUTO_ACKNOWLEDGE,Session.CLIENT_ACKNOWLEDGE,



DUPS_OK_ACKNOWLEDGE 其中一个。




2. 事务的应答确认




A)paramA 设置为 true 时:



paramB 的值忽略, acknowledgment mode 被 jms 服务器设置 SESSION_TRANSACTED 。



当一个事务被提交的时候,消息确认就会自动发生。



B) paramA 设置为 false 时:




Session.AUTO_ACKNOWLEDGE 为自动确认,当客户成功的从 receive 方法返回的时候,或者从



MessageListener.onMessage 方法成功返回的时候,会话自动确认客户收到的消息。



Session.CLIENT_ACKNOWLEDGE 为客户端确认。客户端接收到消息后,必须调用 javax.jms.Message 的



acknowledge 方法。jms 服务器才会删除消息。(默认是批量确认)



DUPS_OK_ACKNOWLEDGE 允许副本的确认模式。一旦接收方应用程序的方法调用从处理消息处返回,会



话对象就会确认消息的接收,而且允许重复确认。如果是重复的消息,那么 JMS provider 必须把消息头



的 JMSRedelivered 字段设置为 true。






9、消费者的消费方式








  • 下两种方法之一:


  • 同步消费。通过调用消费者的 receive 方法从目的地中显式提取消息。receive 方法可以一直阻塞到消息到达。


  • 异步消费。客户可以为消费者注册一个消息监听器,以定义在消息到达时所采取的动作。




实现 MessageListener 接口,在 MessageListener()方法中实现消息的处理逻辑。






JMS 的通信机制