Java 消息服务(Java Message Service

Java 消息服务( Java Message Service ,简称 JMS )是企业级消息传递系统,紧密集成于 Jboss Server 平台之中。企业消息传递系统使得应用程序能够通过消息的交换与其他系统之间进行通信。
 
下图说明 jboss JMS 消息传递。
 
 
消息的组成
消息传递系统的中心就是消息。一条 Message 分为三个组成部分
· 头( header ):是个标准字段集,客户机和供应商都用它来标识和路由消息。头信息包括:
JMSMessageID: 标识提供者发送的每一条消息 , 发送过程中由提供者设置
JMSDestination: 消息发送的 Destination, 由提供者设置
JMSDeliveryMode: 包括 DeliveryMode.PERSISTENT( 被且只被传输一次 )
DeliveryMode.NON_PERSISTENT( 最多被传输一次 )
JMSTimestamp: 提供者发送消息的时间 , 由提供者设置
JMSExpiration: 消息失效的时间 , 是发送方法的生存时间和当前时间值的和 , 0 表明消息不会过期
JMSPriority: 由提供者设置 , 0 最低 , 9 最高
JMSCorrelationID: 用来链接响应消息和请求消息 , 由发送消息的 JMS 程序设置
JMSReplyTo: 请求程序用它来指出回复消息应发送的地方
JMSType: JMS 程序用来指出消息的类型
JMSRedelivered: 消息被过早的发送给了 JMS 程序 , 程序不知道消息的接受者是谁
 
· 属性( property :支持把可选头字段添加到消息。如果您的应用程序需要不使用标准头字段对消息编目和分类,您就可以添加一个属性到消息以实现这个编目和分类。提供 set<Type>Property(...) get<Type>Property(...) 方法以设置和获取各种 Java 类型的属性,包括 Object JMS 定义了一个供应商选择提供的标准属性集:
JMSXUserID: 发送消息的用户的身份
JMSXAppID: 发送消息的应用程序的身份
JMSXDeliveryCount: 尝试发送消息的次数
JMSXGroupID: 该消息所属的消息组的身份
JMSXGroupSeq: 该消息在消息组中的序号
JMSXProducerTxID: 生成该消息的事物的身份
JMSXConsumerTxID: 使用该消息的事物的身份
JMSXRcvTimestamp: JMS 将消息发送给客户的时间
 
· 消息的主体( body ):包含要发送给接收应用程序的内容。每个消息接口特定于它所支持的内容类型。 JMS 为不同类型的内容提供了它们各自的消息类型,但是所有消息都派生自 Message 接口。消息类型有下列几种:
StreamMessage :包含 Java 基本数值流,用标准流操作来顺序的填充和读取。
MapMessage :包含一组名 / 值对;名称为 string 类型,而值为 Java 的基本类型。
TextMessage :包含一个 String
ObjectMessage :包含一个 Serializable Java 对象;能使用 JDK 的集合类。
BytesMessage :包含未解释字节流 : 编码主体以匹配现存的消息格式。
 
 
消息的传递方式:
JMS 支持两种消息传递方式 点对点( point-to-point ,简称 PTP )和发布 / 订阅( publish/subscribe ,简称 pub/sub
 
这两种消息传递方式非常相似,只有以下区别
PTP 消息传递方式规定了一条消息只能传递给一个接收方
Pub/sub 消息传递方式允许一条消息传递给多个接收方
 
每种方式都通过扩展公用基类来实现。例如, PTP javax.jms.Queue pub/sub javax.jms.Topic 都扩展 javax.jms.Destination 类。
 
1 .点对点消息传递
通过点对点 (PTP) 的消息传递模型,一个应用程序可以向另一个应用程序发送消息。 PTP 消息传递应用程序使用命名队列发送接收消息。队列发送方(生成者)向特定队列发送消息。队列接收方(使用者)从特定队列接收消息。见下图
 
一个队列可以关联多个队列发送方和接收方,但一条消息仅传递给一个队列接收方。如果多个队列接收方正在监听队列上的消息, jboss JMS 将根据“先来者优先”的原则确定由哪个队列接收方接收下一条消息。如果没有队列接收方在监听队列,消息将保留在队列中,直至队列接收方连接队列为止。
 
 
2 .发布 / 订阅消息传递
通过发布 / 订阅 (pub/sub) 消息传递模型,应用程序能够将一条消息发送到多个应用程序。 Pub/sub 消息传递应用程序可通过订阅主题来发送和接收消息。主题发布者(生成器)可向特定主题发送消息。主题订阅者(使用者)从特定主题获取消息。见下图
 
PTP 消息传递模型不同, pub/sub 消息传递模型允许多个主题订阅者接收同一条消息。 JMS 一直保留消息,直至所有主题订阅者都收到消息为止。
 
上面两种消息传递方式里,我们都需要定义消息发送者和接收者,消息发送者把消息发送到 Jboss JMS 某个 Destination ,而消息接收者从 Jboss JMS 的某个 Destination 里获取消息。消息接收者可以同步或异步接收消息,一般而言,异步消息接收者的执行和伸缩性都优于同步消息接收者 ,体现在:
1 .异步消息接收者创建的网络流量比较小。单向推动消息,并使之通过管道进入消息监听器。管道操作支持将多条消息聚合为一个网络调用。
 
2 .异步消息接收者使用的线程比较少。异步消息接收者在不活动期间不使用线程。同步消息接收者在接收调用期间内使用线程。结果,线程可能会长时间保持空闲,尤其是如果该调用中指定了阻塞超时。
 
3 .对于服务器上运行的应用程序代码,使用异步消息接收者几乎总是最佳选择,尤其是通过消息驱动 Bean 。使用异步消息接收者可以防止应用程序代码在服务器上执行阻塞操作。而阻塞操作会使服务器端线程空闲,甚至会导致死锁。阻塞操作使用所有线程时则发生死锁。如果没有空余的线程可以处理阻塞操作自身解锁所需的操作,则该操作永远无法停止阻塞。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值