消息中间件 => JMS
Posted 思想累积
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了消息中间件 => JMS相关的知识,希望对你有一定的参考价值。
1、什么是 JMS
JMS(Java Message Language)Java 消息服务指的是两个应用程序之间进行异步通信的 API
JMS 为标准消息协议和消息服务提供了一组通用接口,包括创建、发送、读取消息等。
2、JMS 模型
JMS 提供了两种消息通信模型:
点对点
和发布/订阅
2.1 点对点(Point-to-Point P2P)
- 每个消息只有一个接受者,如果有多个接受者,每个接收者只能获取随机几条信息
- 当消息发送者发送消息的时候,无论接收者程序在不在运行,都能获取到消息
- 当接收者收到消息的时候,会发送确认收到通知(acknowledgement)
2.2 发布/订阅(Publish/Subscribe Pub/Sub)
- 每个消息可以发送给多个接收者只有订阅后才能接收到消息
- 订阅者需要保持连续的存活状态接收消息,除非订阅者创建了持久的订阅,订阅者未收到的消息在重新连接后
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的主要内容,如果未能解决你的问题,请参考以下文章