第二章 理解消息中间件和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

目的地封装消息发送的位置