JMS 原理

  1. 为什么需要JMS

用RPC中间件技术已广泛应用于分布式系统之间的通信,但是这些技术也显示出了局限性:

  1. 同步通信:客户发出调用后,必须等待服务对象完成处理并返回结果后才能继续执行

  2. 客户和服务对象的生命周期紧密耦合,客户端进程和服务端进程都必须正常运行,如果由于服务对象崩溃或者网络故障导致客户的请求不可达,客户会接收到异常。

  3. 点对点通信:客户的一次调用只发送给某个单独的目标对象。

面向消息的中间件较好的解决了以上问题,JMS是SUM提出的:在统一各种MOM系统接口的规范,它包含点对点(PTP)和发布/订阅(pub/sub)两种消息模型,提供可靠消息传输、事务和消息过滤等机制。

JMS

概述:
JAVA消息服务(JMS)定义了java中访问消息中间件的接口。JMS只是接口,并没有给予实现,实现JMS接口的消息中间节成为JMS Provider,例如ActiveMQ.

-术语:
JMS Provider:实现JMS接口的消息中间件,如:ActiveMQ、RabbitMQ、Kafka等。
PTP:点对点的消息模型。
Pub/Sub:发布/订阅的消息模型。
Queue:队列目标。
Topic:主题目标。
ConnectionFactory:连接工厂,JMS用它创建连接。
Connection:JMS客户端到JMS Provider的连接。
Destination:消息的目的地。
Session:会话,一个发送或接收消息的线程。
MessageProducer:由Session对象创建的用来发送消息的对象。
MessageConsumer:由Session对象创建的用来接收消息的对象。
Acknowledge:签收。
Transaction:事务。

模型

在JMS编程模型中,JMS客户端使用connectionFactory对象创建一个连接,向消息服务发送消息以及从消息服务接收消息均是通过此连接来进行。
Connection是客户端与消息服务的活动连接,创建连接时将分配通信资源以及验证客户端。大多数客户端均使用一个连接来进行所有的消息发送。
连接用于创建会话,Session是一个用于生成和使用消息的单线程上下文。它用于创建发送的生产者和接收消息的消费者,并为所发送的消息定义发送顺序,会话通过大量确认选项或通过事务来支持可靠发送。
客户端使用 MessageProducer 向指定的物理目标(在 API 中表示为目标身份对象)发送消息。生产者可指定一个默认传送模式(持久性消息与非持久性消息)、优先级和有效期值,以控制生产者向物理目标发送的所有消息。
同样,客户端使用 MessageConsumer 对象从指定的物理目标(在 API 中表示为目标对象)接收消息。消费者可使用消息选择器,借助它,消息服务可以只向消费者发送与选择标准匹配的那些消息。
消费者可以支持同步或异步消息接收。异步使用可通过向消费者注册 MessageListener 来实现。当会话线程调用 MessageListener 对象的 onMessage 方法时,客户端将使用消息。

编程域

JMS支持两种截然不同的消息传送模型:PTP和Pub/Sub.
PTP: 消息首先被传送至queue,然后根据队列传送策略从该队列将消息传送至向此队列进行注册的某一个消费者,一次只传一条消息。
producer数量没有限制,但是消息只能发送至、并由一个consumer成功使用,如果队目标没有注册的消费者,队列将保留收到的消息,并在某个consumer向该队列进行注册时将消息传送给consumer.
Pub/Sub:在此传送模型中,目标是一个主题然后传送至所有已订阅此主题的活动消费者。producer数量没有限制,consumer数量也没有限制只要成功订阅此主题就可以获取消息。主题目标也支持持久订阅的概念,如果没有想主题目标注册的消费者,主题不保留其接收到的消息,除非有非活动消费者注册了持久订阅。

消息结构

JMS消息由3个部分组成:消息头、属性、消息体。
消息头:包含消息的识别信息和路由信息,消息头包含一些标准的属性
属性:JSM提供一种机制增加新属性到消息头中,这种新属性包含几种:
1、应用需要用到的属性
2、消息投中原有的可选属性
3、JMS Provider需要用到的属性

消息头可选属性:
1、JMSDestination 消息发送的目的地
2、JMSDeliveryMode 传送模式,有两种模式:persistent和non_persistent,persistent表示该消息一定要被送到目的地,否则会导致应用错误。non_persistent表示偶然丢失该消息是被允许的,这两种模式使开发者可以在消息传送的可靠性和吞吐量之间找到平衡点。
3、JMSExpiration:消息过期时间,等于Destination的send方法中的timeToLive值加上发送时刻的GMT时间值,如果timeToLive值等于零,则JMSExpriration被设为零,表示该消息永远不过期。如果发送后,在消息过期时间之后消息还没有被发送到目的地,则该消息被清除。
4、JMSPriority:消息优先级,从0-9是个级别,0-4是普通消息,5-9是加急消息。JMS不要求JMS provider严格按照这十个优先级发送消息,但必须保证加急消息要先于普通消息到达。
5、JMSMessageID:唯一识别每个消息的标识,由JMS Provider产生。
6、JMSTimestamp:一个消息被提交给JMS Provider到消息被发出的时间。
7、JMSCorrelationID:用来连接到另外一个消息,典型的应用是在回复消息中连接到原消息。
8、JMSReplyTo:提供本消息回复消息的目的地址
9、JMSType:消息类型的识别符
10、JMSRedelivered:如果一个客户端收到一个设置了JMSRedelivered属性的消息,则表示可能客户端曾经在早些时候收到过该消息,但并没有签收(acknowledged).

消息体
JMS API定义了5种消息体格式,也叫消息类型。
1、TextMessage:java.lang.String 对象
2、MapMessage:键值对的集合,名是String对象,值类型可以是java任何基本类型。
3、BytesMessage:字节流
4、StreamMessage:java中的输入输出流
5、ObjectMessage:java中的可序列化对象
6、Message:没有消息体,只有消息头和属性

JMS支持并发
Destination 是
ConnectionFactory 是
Connection 是
Session 否
MessageProducer 否
MessageConsumer否

你可能感兴趣的:(JMS 原理)