ilink2005

消息中间件和jms
xiao xi zhong jian jian he jms

(from http://jmsmom.3322.net/mom_jms/jms.html)
(from http://jmsmom.3322.net/mom_jms/jms.html)

当前,corba、dcom、rmi等rpc中间件技术已广泛应用于各个领域。但是面对规模和复杂度都越来越高的分布式系统,这些技术也显示出其局限性:(1)同步通信:客户发出调用后,必须等待服务对象完成处理并返回结果后才能继续执行;(2)客户和服务对象的生命周期紧密耦合:客户进程和服务对象进程都必须正常运行;如果由于服务对象崩溃或者网络故障导致客户的请求不可达,客户会接收到异常;(3)点对点通信:客户的一次调用只发送给某个单独的目标对象。
dang qian corba dcom rmi deng rpc zhong jian jian ji shu yi guang fan ying yong yu ge ge ling yu dan shi mian dui gui mo he fu za du dou yue lai yue gao de fen bu shi xi tong zhe xie ji shu ye xian shi chu qi ju xian xing 1 tong bu tong xin ke hu fa chu diao yong hou bi xu deng dai fu wu dui xiang wan cheng chu li bing fan hui jie guo hou cai neng ji xu zhi hang 2 ke hu he fu wu dui xiang de sheng ming zhou qi jin mi ou he ke hu jin cheng he fu wu dui xiang jin cheng dou bi xu zheng chang yun hang ru guo you yu fu wu dui xiang beng kui huo zhe wang luo gu zhang dao zhi ke hu de qing qiu bu ke da ke hu hui jie shou dao yi chang 3 dian dui dian tong xin ke hu de yi ci diao yong zhi fa song gei mou ge dan du de mu biao dui xiang

面向消息的中间件(message
mian xiang xiao xi de zhong jian jian message

oriented
oriented

middleware,mom)较好的解决了以上问题。发送者将消息发送给消息服务器,消息服务器将消息存放在若干队列中,在合适的时候再将消息转发给接收者。这种模式下,发送和接收是异步的,发送者无需等待;二者的生命周期未必相同:发送消息的时候接收者不一定运行,接收消息的时候发送者也不一定运行;一对多通信:对于一个消息可以有多个接收者。
middleware mom jiao hao de jie jue le yi shang wen ti fa song zhe jiang xiao xi fa song gei xiao xi fu wu qi xiao xi fu wu qi jiang xiao xi cun fang zai ruo gan dui lie zhong zai he shi de shi hou zai jiang xiao xi zhuan fa gei jie shou zhe zhe zhong mo shi xia fa song he jie shou shi yi bu de fa song zhe wu xu deng dai er zhe de sheng ming zhou qi wei bi xiang tong fa song xiao xi de shi hou jie shou zhe bu yi ding yun hang jie shou xiao xi de shi hou fa song zhe ye bu yi ding yun hang yi dui duo tong xin dui yu yi ge xiao xi ke yi you duo ge jie shou zhe

已有的mom系统包括ibm的mqseries、microsoft的msmq和bea的messageq等。由于没有一个通用的标准,这些系统很难实现互操作和无缝连接。java
yi you de mom xi tong bao kuo ibm de mqseries microsoft de msmq he bea de messageq deng you yu mei you yi ge tong yong de biao zhun zhe xie xi tong hen nan shi xian hu cao zuo he wu feng lian jie java

message
message

service(jms)是sun提出的旨在统一各种mom系统接口的规范,它包含点对点(point
service jms shi sun ti chu de zhi zai tong yi ge zhong mom xi tong jie kou de gui fan ta bao han dian dui dian point

to
to

point,ptp)和发布/订阅(publish/subscribe,pub/sub)两种消息模型,提供可靠消息传输、事务和消息过滤等机制。
point ptp he fa bu / ding yue publish/subscribe pub/sub liang zhong xiao xi mo xing ti gong ke kao xiao xi chuan shu shi wu he xiao xi guo lv deng ji zhi

1.jms java
1.jms java

消息服务(jms)定义了java 中访问消息中间件的接口。jms
xiao xi fu wu (jms) ding yi le java zhong fang wen xiao xi zhong jian jian de jie kou jms

只是接口,并没有给予实现,实现jms 接口的消息中间件称为jms
zhi shi jie kou bing mei you gei yu shi xian shi xian jms jie kou de xiao xi zhong jian jian cheng wei jms

provider,ilink实现了jms接口,用户可以通过使用jms接口,在ilink中进行jms编程。
provider ilink shi xian le jms jie kou yong hu ke yi tong guo shi yong jms jie kou zai ilink zhong jin hang jms bian cheng

ilink支持jms1.0.2版本。
ilink zhi chi jms1.0.2 ban ben

2.jms接口描述 jms
2.jms jie kou miao shu jms

支持两种消息类型ptp 和pub/sub,分别称作:ptp domain 和pub/sub
zhi chi liang zhong xiao xi lei xing ptp he pub/sub fen bie cheng zuo ptp domain he pub/sub

domain,这两种接口都继承统一的jms父接口,jms
domain zhe liang zhong jie kou dou ji cheng tong yi de jms fu jie kou jms

主要接口如下所示:
zhu yao jie kou ru xia suo shi

ms父接口
ms fu jie kou

ptp
ptp

pub/sub
pub/sub

connectionfactory
connectionfactory

queueconnectionfactory
queueconnectionfactory

topicconnectionfactory
topicconnectionfactory

connection
connection

queueconnection
queueconnection

topicconnection
topicconnection

destination
destination

queue
queue

topic
topic

session
session

queuesession
queuesession

topicsession
topicsession

messageproducer
messageproducer

queuesender
queuesender

topicpublisher
topicpublisher

messageconsumer
messageconsumer

queuereceiver,queuebrowser
queuereceiver,queuebrowser

topicsubscriber
topicsubscriber













connectionfactory
connectionfactory

:连接工厂,jms 用它创建连接
lian jie gong chang jms yong ta chuang jian lian jie

connection :jms 客户端到jms
connection jms ke hu duan dao jms

provider 的连接
provider de lian jie

destination
destination

:消息的目的地
xiao xi de mu de di

session:
session

一个发送或接收消息的线程
yi ge fa song huo jie shou xiao xi de xian cheng

messageproducer: 由session
messageproducer you session

对象创建的用来发送消息的对象
dui xiang chuang jian de yong lai fa song xiao xi de dui xiang

messageconsumer: 由session
messageconsumer you session

对象创建的用来接收消息的对象
dui xiang chuang jian de yong lai jie shou xiao xi de dui xiang

3.jms消息模型jms
3.jms xiao xi mo xing jms

消息由以下几部分组成:消息头,属性,消息体。
xiao xi you yi xia ji bu fen zu cheng xiao xi tou shu xing xiao xi ti

3.1 消息头(header) -
3.1 xiao xi tou (header) -

消息头包含消息的识别信息和路由信息,消息头包含一些标准的属性如:jmsdestination,jmsmessageid
xiao xi tou bao han xiao xi de shi bie xin xi he lu you xin xi xiao xi tou bao han yi xie biao zhun de shu xing ru jmsdestination,jmsmessageid

等。
deng

消息头
xiao xi tou

由谁设置
you shui she zhi

jmsdestination
jmsdestination

send 或 publish 方法
send huo publish fang fa

jmsdeliverymode
jmsdeliverymode

send 或 publish 方法
send huo publish fang fa

jmsexpiration
jmsexpiration

send 或 publish 方法
send huo publish fang fa

jmspriority
jmspriority

send 或 publish 方法
send huo publish fang fa

jmsmessageid
jmsmessageid

send 或 publish 方法
send huo publish fang fa

jmstimestamp
jmstimestamp

send 或 publish 方法
send huo publish fang fa

jmscorrelationid
jmscorrelationid

客户
ke hu

jmsreplyto
jmsreplyto

客户
ke hu

jmstype
jmstype

客户
ilink2005

ke hu
ilink2005


jmsredelivered
jmsredelivered

jms provider
jms provider







3.2 属性(properties) - 除了消息头中定义好的标准属性外,jms
3.2 shu xing (properties) - chu le xiao xi tou zhong ding yi hao de biao zhun shu xing wai jms

提供一种机制增加新属性到消息头中,这种新属性包含以下几种:
ti gong yi zhong ji zhi zeng jia xin shu xing dao xiao xi tou zhong zhe zhong xin shu xing bao han yi xia ji zhong

1. 应用需要用到的属性;
1. ying yong xu yao yong dao de shu xing ;

2.
2.

消息头中原有的一些可选属性;
xiao xi tou zhong yuan you de yi xie ke xuan shu xing ;

3. jms provider
3. jms provider

需要用到的属性。
xu yao yong dao de shu xing

标准的jms
biao zhun de jms

消息头包含以下属性:
xiao xi tou bao han yi xia shu xing

jmsdestination
jmsdestination

消息发送的目的地
xiao xi fa song de mu de di

jmsdeliverymode
jmsdeliverymode

传递模式, 有两种模式: persistent
chuan di mo shi you liang zhong mo shi persistent

和non_persistent,persistent
he non_persistent persistent

表示该消息一定要被送到目的地,否则会导致应用错误。non_persistent
biao shi gai xiao xi yi ding yao bei song dao mu de di fou ze hui dao zhi ying yong cuo wu non_persistent

表示偶然丢失该消息是被允许的,这两种模式使开发者可以在消息传递的可靠性和吞吐量之间找到平衡点。
biao shi ou ran diu shi gai xiao xi shi bei yun hu de zhe liang zhong mo shi shi kai fa zhe ke yi zai xiao xi chuan di de ke kao xing he tun tu liang zhi jian zhao dao ping heng dian

jmsmessageid
jmsmessageid

唯一识别每个消息的标识,由jms provider
wei yi shi bie mei ge xiao xi de biao shi you jms provider

产生。
chan sheng

jmstimestamp
jmstimestamp

一个消息被提交给jms provider
yi ge xiao xi bei ti jiao gei jms provider

到消息被发出的时间。
dao xiao xi bei fa chu de shi jian

jmscorrelationid
jmscorrelationid

用来连接到另外一个消息,典型的应用是在回复消息中连接到原消息。
yong lai lian jie dao ling wai yi ge xiao xi dian xing de ying yong shi zai hui fu xiao xi zhong lian jie dao yuan xiao xi

jmsreplyto
jmsreplyto

提供本消息回复消息的目的地址
ti gong ben xiao xi hui fu xiao xi de mu de di zhi

jmsredelivered
jmsredelivered

如果一个客户端收到一个设置了jmsredelivered
ru guo yi ge ke hu duan shou dao yi ge she zhi le jmsredelivered

属性的消息,则表示可能该客户端曾经在早些时候收到过该消息,但并没有签收(acknowledged)。
shu xing de xiao xi ze biao shi ke neng gai ke hu duan ceng jing zai zao xie shi hou shou dao guo gai xiao xi dan bing mei you qian shou (acknowledged)

jmstype
jmstype

消息类型的识别符。
xiao xi lei xing de shi bie fu

jmsexpiration
jmsexpiration

消息过期时间,等于queuesender 的send
xiao xi guo qi shi jian deng yu queuesender de send

方法中的timetolive 值或topicpublisher 的publish 方法中的timetolive
fang fa zhong de timetolive zhi huo topicpublisher de publish fang fa zhong de timetolive

值加上发送时刻的gmt 时间值。如果timetolive值等于零,则jmsexpiration
zhi jia shang fa song shi ke de gmt shi jian zhi ru guo timetolive zhi deng yu ling ze jmsexpiration

被设为零,表示该消息永不过期。如果发送后,在消息过期时间之后消息还没有被发送到目的地,则该消息被清除。
bei she wei ling biao shi gai xiao xi yong bu guo qi ru guo fa song hou zai xiao xi guo qi shi jian zhi hou xiao xi hai mei you bei fa song dao mu de di ze gai xiao xi bei qing chu

jmspriority
jmspriority

消息优先级,从0-9 十个级别,0-4 是普通消息,5-9
xiao xi you xian ji cong 0-9 shi ge ji bie 0-4 shi pu tong xiao xi 5-9

是加急消息。jms 不要求jms provider
shi jia ji xiao xi jms bu yao qiu jms provider

严格按照这十个优先级发送消息,但必须保证加急消息要先于普通消息到达。
yan ge an zhao zhe shi ge you xian ji fa song xiao xi dan bi xu bao zheng jia ji xiao xi yao xian yu pu tong xiao xi dao da

3.3 消息体(body) - jms api
3.3 xiao xi ti (body) - jms api

定义了5种消息体格式,也叫消息类型,你可以使用不同形式发送接收数据并可以兼容现有的消息格式,下面描述这5种类型:
ding yi le 5 zhong xiao xi ti ge shi ye jiao xiao xi lei xing ni ke yi shi yong bu tong xing shi fa song jie shou shu ju bing ke yi jian rong xian you de xiao xi ge shi xia mian miao shu zhe 5 zhong lei xing

消息类型
xiao xi lei xing

消息体
xiao xi ti

textmessage
textmessage

java.lang.string对象,如xml文件内容
java.lang.string dui xiang ru xml wen jian nei rong

mapmessage
mapmessage

名/值对的集合,名是string对象,值类型可以是java任何基本类型
ming / zhi dui de ji he ming shi string dui xiang zhi lei xing ke yi shi java ren he ji ben lei xing

bytesmessage
bytesmessage

字节流
zi jie liu

streammessage
streammessage

java中的输入输出流
java zhong de shu ru shu chu liu

objectmessage
objectmessage

java中的可序列化对象
java zhong de ke xu lie hua dui xiang

message
message

没有消息体,只有消息头和属性
mei you xiao xi ti zhi you xiao xi tou he shu xing

下例演示创建并发送一个textmessage到一个队列:
xia li yan shi chuang jian bing fa song yi ge textmessage dao yi ge dui lie

textmessage message = queuesession.createtextmessage();
textmessage message = queuesession.createtextmessage();

message.settext(msg_text); // msg_text is a string
message.settext(msg_text); // msg_text is a string

queuesender.send(message);
queuesender.send(message);

下例演示接收消息并转换为合适的消息类型:
xia li yan shi jie shou xiao xi bing zhuan huan wei he shi de xiao xi lei xing

message m = queuereceiver.receive();
message m = queuereceiver.receive();

if (m instanceof textmessage) {
if (m instanceof textmessage) {

textmessage message = (textmessage) m;
textmessage message = (textmessage) m;

system.out.println("reading message: " +
system.out.println("reading message: " +

message.gettext());
message.gettext());

} else {
} else {

// handle error
// handle error

}
}

4.
4.

消息的同步异步接收
xiao xi de tong bu yi bu jie shou

消息的同步接收是指客户端主动去接收消息,jms
xiao xi de tong bu jie shou shi zhi ke hu duan zhu dong qu jie shou xiao xi jms

客户端可以采用messageconsumer 的receive方法去接收下一个消息。
ke hu duan ke yi cai yong messageconsumer de receive fang fa qu jie shou xia yi ge xiao xi

消息的异步接收是指当消息到达时,主动通知客户端。jms
xiao xi de yi bu jie shou shi zhi dang xiao xi dao da shi zhu dong tong zhi ke hu duan jms

客户端可以通过注册一个实 现messagelistener
ke hu duan ke yi tong guo zhu ce yi ge shi xian messagelistener

接口的对象到messageconsumer,这样,每当消息到达时,jms provider
jie kou de dui xiang dao messageconsumer zhe yang mei dang xiao xi dao da shi jms provider

会调用messagelistener中的onmessage 方法。
hui diao yong messagelistener zhong de onmessage fang fa


ilink2005