第二章 理解消息中间件和JMS
本章涉及内容:
- 关于企业消息的一些发展历史
- 消息中间件(Message-Oriented MIddleware)的定义
- 介绍java消息服务(JMS)
- 使用JMS的API的例子
2.1、介绍企业消息的历史
最初软件架构模型
以前只有一种终端,随着PC机发展,需要使用不同系统PC机的发展
这样使用中央处理机为兼容不同协议更加复杂,这时候出现消息中间件的雏形。减少服务器与客户的耦合性。
2.2、什么是消息中间件?
包裹代收点,快递员只需要将包裹放到代收点,通知对应的人去代收点领取包裹,而代收点可以看做消息中间件
2.3、什么是JMS(java消息服务)
它其实类似与JDBC,它定义消息服务的抽象的API,具体实现由各个厂商实现。就是消息中间件API的规范(当然是java语言)
一些概念:
JMS Client : 纯java写的应用
Non-JMS Client: 使用供应商原生API写的应用
JMS Producer: 创建和发送消息
JMS Consumer: 接收和处理消息
JMS Provider : 实现JMS接口纯java
JMS Message: JMS的消息
JMS Domains: JMS域(包含点对点和发布/订阅)
Administered Objects: 预先定义JMS对象,通过JNDI获得
Connection Factory: 客户端使用连接工厂与JMS供应商进行连接
2.3.1、消息客户端
2.3.1.1、JMS Clients
纯java定义JMS接口,类似JDBC连接关系型数据库一样
2.3.1.1.1 JMS Producer (消息产生者)
2.3.1.1.2. JMS Consumer(消息消费者)
2.3.1.2. Non-JMS Clients
也就是不同供应商处理实现java定义的JMS接口,还实现一些其他特性的接口
2.3.2. JMS供应商
也就是JMS API的具体实现,每个供应商是不同的
2.3.3剖析JMS消息
JMS结构包含三个部分, Headers 和 Properties 以及Payload
2.3.3.1.JMS 消息头
JMSDestination: 消息传递目的地
JMSDeliveryMode: 持久化模式和非持久化的模式
持久化模式:当提供消息对象执行发送失败,消息不会丢失,有且仅传递一次
非持久化模式:当提供消息对象执行失败,消息会丢失,至多传递一次。
JMSExpiration: 消息失效(不会传递失效消息)通过MessageProducer.setTimeToLive()设置(0表示不会失效,默认值为0)
JMSMessageID:消息唯一标识
JMSPriority:定义十个级别,0最低,9最高,其实就是类似EMS的速递和普通邮件的优先级不一样
JMSTimestamp: 时间戳,可以取消这个选项
对于客户端的头部信息
JMSCorrelationID: 通过请求消息关联响应消息
JMSReplyTo:判断是否需要返回值
JMSType: 消息类型
对于JMS供应商的头信息
JMSRedelivered:避免特定消息传递
2.3.3.2.JMS Mesasge Properties(JMS 消息属性)
这个被认为是自己定义header信息
有三种属性: 自定义属性,JMS定义的属性和供应商定义的属性。
2.3.3.2.1、 自定义属性
2.3.3.2.2. JMS定义的属性
它是以“JMSX”为前缀的属性,例如:
JMSXAppID: 标识发送消息的应用
JMSXState: 用户定义的特定供应商状态
JMSXUserID: 标识发送消息的用户。
2.3.3.2.3. 供应商定义属性
以“JMS_<供应商>” ,例如Apache供应商,可以"JMS_Apache"为前缀
2.3.4.消息选择器
其实就是有选择过滤一些消息。
JMS选择语法:来自SQL92语法
类似SpringEL,用字符串表达式
2.3.4.1.消息体
六种消息体:
Message: 没有payload,只有头部和属性
TextMessage: payload是简单字符串(简单文本或xml)
MapMessage: payload为键值对,键为字符串,值为java原生类型(4类八种)
BytesMessage: 字节数组
StreamMessage: 包含原生数据类型流,按顺序填充和读取
ObjectMessage: payload为java对象
2.3.5.JMS 域
有两种:点对点和发布/订阅
2.3.5.1. 点对点域
经典就是队列实现,如果是同步可以使用MessageConsumer.receive() ,异步 注册一个监听器MessageConsumer.setMessageListener();
2.3.5.2 发布/订阅 域
类似,杂志和报纸一样,内容相同报纸可以买不同的人
2.3.5.2.1.区分Message Durability 和 MessagePersistence
Message Durability 只是用于发布/订阅中,它有两种durable和non-durable
其实就是当网络断开之后JMS提供者是否保存订阅者推送消息状态,(durable保存,non-durable不会保存)
MessagePersistence:表示处理JMS消息发送失败之后进行的处理,可以通过JMSDeliveryMode属性进行设置
2.3.6. 管理对象
其实就是一个配置对象,一般通过JNDI,JMS有两种管理对象:ConnectionFactory和Destination
2.3.6.1. ConnectionFactory
类似JDBC连接,客户端连接JMS提供者
2.3.6.2.Destination
目的地封装消息发送的位置