1.JMS概述
JAVA 消息服务(JMS)定义了Java 中访问消息中间件的接口。JMS只是接口,并没有给予实现,实现JMS接口的消息中间件称为JMS Provider
消息中间件提供企业数据的异步传输,通过消息中间件,一些原本互相孤立的业务组件可以组合成一个可靠的、灵活的系统。也可以模拟实现同步传输,但其实质仍然是异步的。
JMS 支持两种消息类型PTP (Point-to-Point)和Pub/Sub(Publish-Subscribe),分别称作:PTP Domain 和Pub/Sub Domain。
PTP的主要特点是:
1)一条消息只有一个使用者
2)不存在时间限制
Pub/Sub主要特点有:
1)一条消息可以有多个使用者
2)存在时间限制。订阅者可以使用持久方式来订阅消息,但是也会过期或者取消订阅
这两种接口都继承统一的JMS Parent 接口,JMS 主要接口如下所示:
JMS Parent |
PTPDomain |
Pub/Sub Domain |
ConnectionFactory |
QueueConnectionFactory |
TopicConnectionFactory |
Connection |
QueueConnection |
TopicConnection |
Destination |
Queue |
Topic |
Session |
QueueSession |
TopicSession |
MessageProducer |
QueueSender |
TopicPublisher |
MessageConsumer |
QueueReceiver,QueueBrowser |
TopicSubscriber |
以下是对这些接口的简单描述:
ConnectionFactory :连接工厂,JMS 用它创建连接
Connection :JMS 客户端到JMS Provider 的连接
Destination :消息的目的地
Session: 一个发送或接收消息的线程
MessageProducer: 由Session 对象创建的用来发送消息的对象
MessageConsumer: 由Session 对象创建的用来接收消息的对象
2.JMS消息模型
JMS 消息由以下几部分组成:消息头,属性,消息体。
消息头(Header) -消息头包含消息的识别信息和路由信息,消息头包含一些标准的属性如:JMSDestination,JMSMessageID等。
消息头 |
由谁设置 |
JMSDestination |
send 或 publish 方法 |
JMSDeliveryMode |
send 或 publish 方法 |
JMSExpiration |
send 或 publish 方法 |
JMSPriority |
send 或 publish 方法 |
JMSMessageID |
send 或 publish 方法 |
JMSTimestamp |
send 或 publish 方法 |
JMSCorrelationID |
客户 |
JMSReplyTo |
客户 |
JMSType |
客户 |
JMSRedelivered |
JMS Provider |
属性(Properties) -除了消息头中定义好的标准属性外,JMS提供一种机制增加新属性到消息头中,这种新属性包含以下几种:
-
应用需要用到的属性;
-
消息头中原有的一些可选属性;
-
JMS Provider 需要用到的属性。
标准的JMS 消息头包含以下属性:
JMSDestination --消息发送的目的地。
JMSDeliveryMode --传递模式,有两种模式:PERSISTENT和NON_PERSISTENT,PERSISTENT表示该消息一定要被送到目的地,否则会导致应用错误。 NON_PERSISTENT表示偶然丢失该消息是被允许的,这两种模式使开发者可以在消息传递的可靠性和吞吐量之间找到平衡点。
JMSMessageID 唯一识别每个消息的标识,由JMS Provider 产生。
JMSTimestamp 一个消息被提交给JMS Provider 到消息被发出的时间。
JMSCorrelationID 用来连接到另外一个消息,典型的应用是在回复消息中连接到原消息。
JMSReplyTo 提供本消息回复消息的目的地址。
JMSRedelivered如果一个客户端收到一个设置了JMSRedelivered属性的消息,则表示可能该客户端曾经在早些时候收到过该消息,但并没有签收(acknowledged)。
JMSType 消息类型的识别符。
JMSExpiration 消息过期时间,等于QueueSender 的send方法中的timeToLive值或TopicPublisher 的publish 方法中的timeToLive值加上发送时刻的GMT时间值。如果timeToLive值等于零,则JMSExpiration被设为零,表示该消息永不过期。如果发送后,在消息过期时间之后消息还没有被发送到目的地,则该消息被清除。
JMSPriority 消息优先级,从0-9 十个级别,0-4 是普通消息,5-9 是加急消息。JMS 不要求JMS Provider严格按照这十个优先级发送消息,但必须保证加急消息要先于普通消息到达。
消息体(Body) - JMS API定义了5种消息体格式,也叫消息类型,你可以使用不同形式发送接收数据并可以兼容现有的消息格式,下面描述这5种类型:
消息类型 |
消息体 |
TextMessage |
java.lang.String对象,如xml文件内容 |
MapMessage |
名/值对的集合,名是String对象,值类型可以是Java任何基本类型 |
BytesMessage |
字节流 |
StreamMessage |
Java中的输入输出流 |
ObjectMessage |
Java中的可序列化对象 |
Message |
没有消息体,只有消息头和属性 |
Message是以上5类的基础。最常用的是ObjectMessage和TextMessage
3.消息的同步异步接收
消息的同步接收
同步接收是指客户端主动去接收消息,JMS 客户端可以采用MessageConsumer的receive方法去接收下一个消息。
消息的异步接收
异步接收是指当消息到达时,主动通知客户端。JMS客户端可以通过注册一个实现MessageListener接口的对象到MessageConsumer,这样,每当消息到达时,JMS Provider 会调用MessageListener中的onMessage 方法。
4.PTP模型
PTP(Point-to-Point)模型是基于队列的,发送方发消息到队列,接收方从队列接收消息,队列的存在使得消息的异步传输成为可能。和邮件系统中的邮箱一样,队列可以包含各种消息,JMS Provider 提供工具管理队列的创建、删除。JMS PTP模型定义了客户端如何向队列发送消息,从队列接收消息,浏览队列中的消息。
下面描述JMS PTP 模型中的主要概念和对象:
名称 |
描述 |
Queue |
由JMS Provider 管理,队列由队列名识别,客户端可以通过JNDI接口用队列名得到一个队列对象。 |
TemporaryQueue |
由QueueConnection 创建,而且只能由创建它的QueueConnection 使用。 |
QueueConnectionFactory |
客户端用QueueConnectionFactory 创建QueueConnection 对象。 |
QueueConnection |
一个到JMS PTP provider 的连接,客户端可以用QueueConnection创建QueueSession来发送和接收消息。 |
QueueSession |
提 供一些方法创建QueueReceiver、QueueSender、QueueBrowser和TemporaryQueue。如果在 QueueSession关闭时,有一些消息已经被收到,但还没有被签收(acknowledged),那么,当接收者下次连接到相同的队列时,这些消息 还会被再次接收。 |
QueueReceiver |
客户端用QueueReceiver接收队列中的消息,如果用户在QueueReceiver中设定了消息选择条件,那么不符合条件的消息会留在队列中,不会被接收到。 |
QueueSender |
客户端用QueueSender 发送消息到队列。 |
QueueBrowser |
客户端可以QueueBrowser 浏览队列中的消息,但不会收走消息。 |
QueueRequestor |
JMS 提供QueueRequestor类简化消息的收发过程。QueueRequestor的构造函数有两个参数:QueueSession和queue,QueueRequestor 通过创建一个临时队列来完成最终的收发消息请求。 |
可靠性(Reliability) |
队列可以长久地保存消息直到接收者收到消息。接收者不需要因为担心消息会丢失而时刻和队列保持激活的连接状态,充分体现了异步传输模式的优势。 |
4.Pub/Sub模型
JMS Pub/Sub 模型定义了如何向一个内容节点发布和订阅消息,这些节点被称作主题(topic)。
主题可以被认为是消息的传输中介,发布者(publisher)发布消息到主题,订阅者(subscribe)从主题订阅消息。主题使得消息订阅者和消息发布者保持互相独立,不需要接触即可保证消息的传送。
下面描述JMS Pub/Sub 模型中的主要概念和对象:
名称 |
描述 |
订阅(subscription) |
消息订阅分为非持久订阅(non-durable subscription)和持久订阅(durablesubscrip-tion),非持久订阅只有当客户端处于激活状态,也就是和JMS Provider保持连接状态才能收到发送到某个主题的消息,而当客户端处于离线状态,这个时间段发到主题的消息将会丢失,永远不会收到。持久订阅时,客户端向JMS注册一个识别自己身份的ID,当这个客户端处于离线时,JMS Provider 会为这个ID 保存所有发送到主题的消息,当客户再次连接到JMS Provider时,会根据自己的ID得到所有当自己处于离线时发送到主题的消息。 |
Topic |
主题由JMS Provider 管理,主题由主题名识别,客户端可以通过JNDI接口用主题名得到一个主题对象。JMS没有给出主题的组织和层次结构的定义,由JMS Provider 自己定义。 |
TemporaryTopic |
临时主题由TopicConnection创建,而且只能由创建它的TopicConnection使用。临时主题不能提供持久订阅功能。 |
TopicConnectionFactory |
客户端用TopicConnectionFactory 创建TopicConnection 对象。 |
TopicConnection |
TopicConnection 是一个到JMS Pub/Sub provider的连接,客户端可以用TopicConnection创建TopicSession来发布和订阅消息。 |
TopicSession |
TopicSession提供一些方法创建TopicPublisher、TopicSubscriber、TemporaryTopic。它还提供unsubscribe方法取消消息的持久订阅。 |
TopicPublisher |
客户端用TopicPublisher 发布消息到主题。 |
TopicSubscriber |
客户端用TopicSubscriber接收发布到主题上的消息。可以在TopicSubscriber中设置消息过滤功能,这样,不符合要求的消息不会被接收。 |
Durable TopicSubscriber |
如果一个客户端需要持久订阅消息,可以使用Durable TopicSubscriber,TopSession提供一个方法createDurableSubscriber创建Durable TopicSubscriber 对象。 |
恢复和重新派送(Recovery and Redelivery) |
非持久订阅状态下,不能恢复或重新派送一个未签收的消息。只有持久订阅才能恢复或重新派送一个未签收的消息。 |
TopicRequestor |
JMS 提供TopicRequestor类简化消息的收发过程。TopicRequestor的构造函数有两个参数:TopicSession和topic。TopicRequestor 通过创建一个临时主题来完成最终的发布和接收消息请求。 |
可靠性(Reliability) |
当所有的消息必须被接收,则用持久订阅模式。当丢失消息能够被容忍,则用非持久订阅模 |
分享到:
相关推荐
1. **JMS基本概念**: - **消息**:JMS中的基本单元,它是一个数据对象,包含要传递的信息。 - **消息生产者**(Message Producer):负责创建和发送消息的组件。 - **消息消费者**(Message Consumer):接收并...
#### 一、JMS基本概念 **1.1 什么是JMS(JAVA MESSAGE SERVICE)?** JMS,即Java Message Service,是Java平台中的消息服务应用标准,允许应用程序组件通过Java消息服务进行通信。它为分布式系统提供了消息传递和...
2. **JMS基本概念**: - **消息**:消息由消息主体(数据)和消息标题(元数据,包含目标、有效期等属性)组成。 - **消息服务体系结构**:JMS定义了两种主要的消息传送模型——点对点(Point-to-Point, PTP)和...
#### 一、JMS 基本概念与通信模型 JMS(Java Message Service)是一种广泛应用于企业级应用程序之间的消息传递标准,它定义了一系列接口,用于创建、发送、接收消息。JMS 的设计目标是简化应用程序之间的通信流程,...
### 一、JMS基本概念 1. **Queue(队列)**:队列是一种点对点的消息传递模型,其中每个消息只会被一个消费者接收。一旦消息被消费,它就会从队列中移除。这种模式适用于一对多的单播通信。 2. **TOPIC(主题)**...
**JMS基本概念** 1. **JMS API**:JMS 提供了一组接口和类,使得开发者能够创建、发送、接收和消费消息。它定义了生产者(Producer)和消费者(Consumer)的概念,生产者负责创建和发送消息,消费者则负责接收和...
### JMS基本概念与原理详解 #### 一、引言 Java消息服务(JMS,Java Message Service)作为Java Platform Enterprise Edition (Java EE) 的重要组成部分之一,为开发者提供了一个强大的消息中间件标准。通过这一...
1. **JMS基本概念** - **点对点模型**:在这个模型中,消息生产者将消息发送到一个Queue(队列),消息接收者从队列中读取消息,每个消息仅被一个接收者消费,一旦消息被读取,它就会从队列中消失。 - **发布/订阅...
第1章JMS基本概念 JMS定义了访问企业消息系统的标准API,这些API支持创建、发送、接收消息。JMS规范中的消息模型可以分为两种类型:点对点(Point-to-Point,PTP)和发布/订阅(Publish-Subscribe,Pub/Sub)。JMS...
1. **JMS基本概念** - **消息**:JMS中的核心元素,是数据传输的载体。 - **消息队列(Queue)**:FIFO(先进先出)结构,每个消息只被一个消费者消费。 - **主题(Topic)**:发布/订阅模式,一个消息可以被多个...
1. **JMS基本概念**: - **消息**:是数据载体,包含要传递的信息。 - **生产者**:创建并发送消息的应用程序。 - **消费者**:接收并处理消息的应用程序。 - **队列(Queue)**:FIFO(先进先出)结构,每个...
JMS基本概念** 1.1 **点对点(P2P)通信** 点对点通信基于队列模型,每个消息只有一个消费者。生产者发送消息到队列,消费者从队列中接收消息。如果消费者未在线,消息会被存储直到消费者准备接收。这种模式确保...
1. **JMS基本概念**: - **消息**:数据传输的载体,包含消息头和消息体。 - **生产者**:创建并发送消息的应用。 - **消费者**:接收并处理消息的应用。 - **队列(Queue)**:FIFO(先进先出)模型,每个消息...
1. **JMS基本概念** - **消息**:在JMS中,数据通过消息进行传递。消息包含要传输的数据,以及描述数据的元数据。 - **消息生产者**:创建并发送消息的组件。 - **消息消费者**:接收并处理消息的组件。 - **...
**JMS 基本概念** 1. **消息服务**:JMS定义了一套接口和规范,允许Java应用通过消息传递方式与其他系统通信。这些消息可以是同步的也可以是异步的,从而实现解耦和高可用性。 2. **API接口**:JMS提供了一组标准...
JMS基本概念** JMS的核心概念是消息和消息队列。消息是数据的一种传输形式,它可以包含各种类型的数据,并且可以在应用程序之间独立传输。消息队列则是存储和转发这些消息的实体,确保消息被正确地发送和接收,...
JMS 信息传输实例代码 ...JMS 入门的知识点包括 JMS 基本概念、Destination、Message、Session、Connection、ConnectionFactory、Producer 和 MessageConsumer 等。了解这些概念对于初学 JMS 者非常重要。
**JMS基本概念** 1. **消息模型**:JMS支持两种主要的消息通信模型: - **点对点(Point-to-Point, PTP)**:在这种模型中,消息从一个生产者发送到一个消费者。消息队列作为中介,确保消息只被一个消费者接收,...
2. **JMS基本概念** - **消息队列**:JMS的核心概念,用于存储待处理的消息。 - **消息**:传输的数据单元,包含了消息头和消息体。 - **生产者**:发送消息的应用。 - **消费者**:接收消息的应用。 - **提供...
总的来说,基于Jboss的JMS编程涉及到Spring的集成、JNDI配置、连接工厂的创建、消息模板的使用,以及对JMS基本概念的理解。通过这些知识,开发者可以创建可靠的、基于消息的系统,提高应用程序的可伸缩性和解耦性。