Java 消息服务(JMS)

来源:互联网 发布:好家伙 盗亦有道 知乎 编辑:程序博客网 时间:2024/05/17 22:56

一、概述

  JMS给Java程序员提供了一种通用的方式来创建、发送、接收和查看企业消息系统消息。JMS的所有用户都称为客户端(Client)
  Java消息服务(Java Message Service, JMS)可以在完全不同的平台上实现应用程序和系统请求的服务调用;异步处理请求的能力,缓解系统瓶颈,提高系统的可伸缩性;能够实现组件之间的高度解耦,使系统具有高度的灵活性和敏捷性。

二、架构

描述基于消息的应用的环境和JMS在环境中扮演的角色

什么是 JMS 应用?

JMS由以下部分组成:
 1. JMS客户端 – 发送和接收消息的Java 语言程序
 2. 消息 – 定义的一系列消息,用于客户端之间交换信息
 3. JMS提供商 – 它是一个消息系统,实现了JMS 及其他完整消息产品所需要的管理和控制功能
 4. 被管理的对象 – 是预先配置好的 JMS 对象,由管理员为客户端使用而创建

  JMS 客户端可移植,就是通过定义 JMS 被管理对象,这些对象由提供商的管理员创建和客户化,然后由客户端使用。有两种类型的 JMS被管理对象:
  (1)ConnectionFactory – 用于客户端来创建与提供商的连接
  (2)Destination – 用于客户端来指定发送消息的目的地,也就是接收消息的来源
  被管理的对象被管理员放置在 JNDI 命名空间,如图 JMS管理
  
这里写图片描述

JMS 两种消息传送模型

  JMS支持两类消息传送模型:点对点模型(p2p, 一对一)和发布/订阅模型(Pub/Sub, 一对多)。这两种风格常被称为消息域
  
  消息传送客户端称为JMS客户端(JMS client),消息传送系统称为JMS提供者(JMS provide)。一个JMS客户端既可以是消息生产者,又是消息消费者。
(1)点对点模型
  JMS客户端通过队列(queue)来同步和异步发送、接收消息。发送到队列的消息一旦被一个接收者读取后,就在队列中消失,所以一个消息只能被一个接收者消费。
(2)发布/订阅模型
  发布者发布一个消息到一个名为主题(topic)的通道中,这个topic中的消息可以由多个订阅者接收

JMS 接口

JMS基于一系列通用的消息,每个消息域(PTP和Pub/Sub)也为这些概念定义了各自的接口集
这里写图片描述

JMS公共API
ConnectionFactory:客户端使用这个被管理对象创建一个Connection
Connection:一个与JMS提供商建立的连接
Destination:消息发送的目的地的被管理对象
Session:用于发送和接收消息的单线程上下文
MessageProducer:由Session创建的用于往目的地发送消息的对象
MessageConsumer:由Session创建的用于接收发送到目的地的消息的对象

这里写图片描述
注: “生产”:指JMS提供商将一个消息转发到一个目的地;“消费”:一个JMS客户端接收消息

开发一个JMS客户端

 • 使用 JNDI 发现 ConnectionFactory 对象
 • 使用 JNDI 发现一个或多个 Desitination 对象
 • 使用 ConnectionFactory 创建一个具有消息转发的JMS Connection
 • 使用 Connection 创建一个或多个 JMS Session
 • 使用 Session 和 Desitination 创建需要的 MessageProducer 和MessageConsumer
 • 启动 Connection,开始转发消息

三、JMS 消息模型

  企业消息产品把消息看成轻量级的实体,它由消息头消息体组成,消息头包含消息路由和标识的字段;消息体包含了被发送的应用数据。

JMS 消息

JMS 消息由以下部分组成:
 • 消息头 – 头字段包含客户端和提供商都要使用的用于标识和路由消息的值
 • 属性 – 消息提供一个内置的功能来向消息增加可选的头字段
 • 消息体 – JMS 定义了几个消息体类型,覆盖了大部分使用的消息风格

消息头

 • JMSDestination
 • JMSDeliveryMode
 • JMSMessageID
 • JMSTimestamp
 • JMSCorrelationID
 • JMSReplyTo
 • JMSRedelivered
 • JMSType
 • JMSExpiration
 • JMSPriority

属性
消息体

JMS 提供五种形式的消息体
  • StreamMessage 对象的消息体包含了Java原始数据类型流。它按顺序填充和读取。
  • MapMessage 对象的消息体包含了一系列的 名-值 对,其中,名称是 String 类型的对象,值是Java原始类型。其中的条目可以顺序或随机的通过名称来访问。每个条目的顺序是不确定的。
  • TextMessage 对象的消息体包含一个 java.lang.String 对象。该类型的消息可以用来传送纯文本和XML消息。
  • ObjectMessage 对象的消息体包含一个 Serializable Java对象。
  • BytesMessage 对象的消息体包含了一个未经解释的字节流。该消息类型逐字地编码消息体以匹配现存的消息格式。在多数情况下,可以考虑更易于使用的其他消息类型。尽管JMS API允许在该消息上使用消息属性,但通常并不这么用,因为包含的消息属性可能会影响格式。

待续。。。
http://blog.csdn.net/wl_ldy/article/details/7884534
http://www.360doc.com/content/12/0518/14/2905268_211883981.shtml
http://blog.csdn.net/keda8997110/article/details/13997859
http://boy00fly.iteye.com/blog/1103586

0 0
原创粉丝点击