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
。使用异步消息接收者可以防止应用程序代码在服务器上执行阻塞操作。而阻塞操作会使服务器端线程空闲,甚至会导致死锁。阻塞操作使用所有线程时则发生死锁。如果没有空余的线程可以处理阻塞操作自身解锁所需的操作,则该操作永远无法停止阻塞。