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 的通信机制





  • 分布式
    43 引用 • 97 回帖
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    59 引用 • 285 回帖
感谢    关注    收藏    赞同    反对    举报    分享