消息中间件 => JMS

Posted 思想累积

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了消息中间件 => JMS相关的知识,希望对你有一定的参考价值。

1、什么是 JMS

JMS(Java Message Language)Java 消息服务指的是两个应用程序之间进行异步通信的 API
JMS 为标准消息协议和消息服务提供了一组通用接口,包括创建、发送、读取消息等。

2、JMS 模型

JMS 提供了两种消息通信模型:点对点发布/订阅

2.1 点对点(Point-to-Point P2P)

  1. 每个消息只有一个接受者,如果有多个接受者,每个接收者只能获取随机几条信息
  2. 当消息发送者发送消息的时候,无论接收者程序在不在运行,都能获取到消息
  3. 当接收者收到消息的时候,会发送确认收到通知(acknowledgement)

2.2 发布/订阅(Publish/Subscribe Pub/Sub)

  1. 每个消息可以发送给多个接收者只有订阅后才能接收到消息
  2. 订阅者需要保持连续的存活状态接收消息,除非订阅者创建了持久的订阅,订阅者未收到的消息在重新连接后

3、 JMS 组成元素

  • provider:实现 JMS 接口和规范的消息中间件,MQ
  • producer:消息生产者,创建和发送 JMS 消息的客户端应用
  • consumer:消息消费者:接收和处理 JMS 消息的客户端应用
  • message
    • 消息头
      • JMSDestination:消息发送的目的地,主要指 Queue 和 Topic
      • JMSDeliveryMode:持久模式和非持久模式
      • JMSExpiration:可以设置消息在一定时间后过期,等于 Destination 的 send 方法中的 timeToLive 值加上 发送时刻的 GMT 时间值,如果 timeToLive 值为 0,JMSExpiration 被设为 0,表示消息永不过期
      • JMSPriority:消息优先级,默认 4 级,级别从 0 到 9,5 到 9 是加急消息
      • JMSMessageID:唯一识别每个消息的id
    • 消息体
      • 封装具体的消息数据
      • 发送和接受的消息体类型必须一直对应
      • 消息体格式:
        • TextMessage:普通字符串,包含一个 string
        • MapMessage:一个 Map 类型的消息,key 为 string 类型,值为 java 基本数据类型
        • BytesMessage:二进制数组消息,包含一个 byte[]
        • StreamMessage:java 数据流消息,用标准流操作来顺序的填充和读取
        • ObjectMessage:对象消息,包含一个可序列化的 Java 对象
    • 消息属性
      • 需要除消息头字段以外的值,可以使用消息属性
      • 识别、去重、重点标注等操作非常有用的方法
      • 消息属性以属性名和属性值对的形式制定的,可以将属性作为消息头的扩展,属性指定一些消息头没有包括的附加信息,比如消息选择器。

4、 JMS 可靠性

JMS PERSINSTENT 持久性

Queue 持久化消息:

  • 非持久化:服务器宕机,消息不存在
    • messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
  • 持久化:服务器宕机,消息依旧存在,队列的默认传送方式,保证消息只被传送一次和成功使用一次
    • messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);

Topic 持久化消息:

  • 持久化:
    • session.createDurableSubscriber(Topic var1, String var2)
    • 先运行一次消费者,等于向 MQ 注册,再运行生产者发送消息,无论消费者是否在线,都会接收到,不在线的话,下次连接会将未收过的消息接收

JMS transaction 事务

事务偏向于生产者,签收偏向于消费者

// 第一个参数为是否开启事务,第二个参数为签收
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

生产者 producer 提交时的事务

  • 如果参数为 false,执行 send 就会进入队列,关闭事务,第二个签收参数的设置需要有效
  • 如果参数设置为 true,先执行 send 再执行 commit,消息才会被真正的提交到队列中

消费者事务

  • 事务开启消费者需要 commit 后才是真正消费了消息

签收

  • 自动签收(默认):Session.AUTO_ACKNOWLEDGE
  • 手动签收:Session.CLIENT_ACKNOWLEDGE客户端调用 acknowledge 方法进行手动签收,可以避免消息重复消费
  • 允许重复消息:Session.DUPS_OK_ACKNOWLEDGE

签收和事务的关系

事务开启的话,一个事务被成功提交则消息被自动签收,如果事务回滚,消息会再次发送

未开启事务,消息什么时候被确认取决于创建会话时的签收应答模式

4、 JMS 开发的基本步骤

  • 创建一个 connectionfactory:可以有 QueueConnectionFactory 或 TopicConnectionFactory
  • 通过 connectionfactory 创建 JMS connection:客户端和 JMS 系统之间的连接
  • 启动 JMS connection
  • 通过 connection 创建 JMS session:Session 可以用来创建生产者、消费者、消息等
  • 创建 JMS destination:消息生产者的消息发送目标,消费者消息来源,也就是 Topic 或者 Queue
  • 使用 Session创建 JMS productor 或者创建 JMS message 并设置 destination
  • 使用 Session 创建 JMS consumer 或者注册一个 JMS message listener
  • 发送或者接受 JMS messages
  • 关闭所有 JMS 资源(connection、session、producer、consumer)

以上是关于消息中间件 => JMS的主要内容,如果未能解决你的问题,请参考以下文章

消息中间件--ActiveMQ&JMS消息服务

消息中间件 — JMS规范

JMS基本概念

JMS的基本概念

ActiveMQ——理解和掌握JMS

消息中间件 => JMS