锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
鍘熸枃:http://www.onjava.com/pub/a/onjava/2006/02/22/asynchronous-messaging-with-spring-jms.html聽
寮傛澶勭悊閫氫俊鏄潰鍚戞湇鍔℃灦鏋勶紙SOA錛夌殑閲嶈閮ㄥ垎錛屽洜涓轟紒涓氫腑鐨勮澶氱郴緇熼氫俊錛屽挨鍏舵槸璺熷閮ㄧ郴緇熼氫俊鏈潵灝辨槸寮傛鐨勩侸ava娑堟伅鏈嶅姟錛圝MS錛夊氨鏄敤鏉ョ紪鍐欏紓姝ユ秷鎭疛2EE搴旂敤鐨凙PI銆備嬌鐢↗MS API鐨勪紶緇熸秷鎭疄鐜版秹鍙婂埌璞¤繖鏍風殑涓浜涙楠わ細鏌ユ壘瀵瑰垪榪炴帴宸ュ巶銆侀槦鍒楄祫婧愪互鍙婂湪瀹為檯鍙戦佸拰鎺ュ彈娑堟伅鍓嶏紝鍒涘緩JMS浼氳瘽錛圝MS session錛夈?br />
Spring framework綆鍖栦簡鐢↗EE緇勪歡錛堝寘鎷琂MS錛夊紑鍙慗MS搴旂敤鐨勫伐浣溿傚畠鎻愪緵浜嗕竴涓ā鏉挎満鍒舵潵闅愯棌鍏稿瀷鐨凧MS瀹炵幇緇嗚妭錛屾墍浠ュ紑鍙戣呭彲浠ヤ笓娉ㄤ簬娑堟伅澶勭悊浠誨姟鑰屼笉鐢ㄦ媴蹇冩庢牱鍒涘緩銆佽闂拰閲婃斁JMS璧勬簮銆?br />
鏈枃鐢ㄤ竴涓繍琛屽湪JBoss MQ server涓婄殑綆鍗昗eb搴旂敤姒傝堪浜哠pring JMS API鍜屾庢牱浣跨敤瀹冨紓姝ュ鐞嗭紙鍙戦佸拰鎺ュ彈錛夋秷鎭傛垜灝嗗姣擩MS瀹炵幇鐨勪紶緇熸柟娉曞拰Spring JMS瀹炵幇鏂規硶錛屼互鏄劇ず浣跨敤Spring JMS鏉ュ鐞嗘秷鎭槸澶氫箞鐨勭畝鍗曞拰鐏墊椿銆?/p>
寮傛娑堟伅鍜孲OA
鐜板疄涓栫晫涓紝澶у鏁癢eb璇鋒眰鏄悓姝ュ鐞嗙殑銆備緥濡傦紝褰撶敤鎴風櫥闄嗕竴涓珯鐐癸紝浠栨垨濂硅緭鍏ョ敤鎴峰悕鍜屽彛浠や互鍙婃湇鍔″櫒璇嗗埆鐧婚檰鍑瘉銆傚鏋滆韓浠介獙璇佹垚鍔燂紝紼嬪簭璁╃敤鎴瘋繘鍏ョ珯鐐廣傝繖閲岋紝鐧婚檰璇鋒眰浠庡鎴風琚帴鍙楀悗錛岀珛鍗寵澶勭悊銆備俊鐢ㄥ崱鎺堟潈涔熸槸涓涓悓姝ュ鐞嗙殑渚嬪瓙錛涗粎褰撴湇鍔″櫒鏍稿疄浜嗗彂閫佽繘鏉ョ殑淇$敤鍗″彿鏄湁鏁堝茍涓旇瀹㈡埛鐨勫笎鍙鋒湁瓚沖鐨勪俊鐢ㄩ搴﹀悗錛屾墠鍏佽瀹㈡埛緇х畫榪涜涓嬩竴姝ュ姩浣溿傝鎴戜滑鏉ヨ冨療涓涓嬭鍗曞鐞嗙郴緇熶腑鐨勬敮浠樼粨綆楁楠ゃ備竴鏃︾郴緇熸牳瀹炰簡閭d釜鐢ㄦ埛鐨勪俊鐢ㄥ崱淇℃伅鏄紜殑錛岃屼笖甯愭埛涓婃湁瓚沖鐨勮祫閲戯紝閭d箞涓嶉渶瑕佺瓑鍒版敮浠樼粏鑺傚拰杞笎鏈緇堝畬鎴愩傛敮浠樼粨綆楃敤寮傛鏂瑰紡澶勭悊錛屽姝ゅ鎴蜂究鍙互緇х畫榪涜緇撳笎澶勭悊銆?br />
涓庡吀鍨嬬殑鍚屾璇鋒眰鐩告瘮錛屽紓姝ュ鐞嗙敤浜庨渶瑕侀暱鏃墮棿鏉ュ鐞嗙殑璇鋒眰銆傚紓姝ュ鐞嗙殑鍙﹀涓涓緥瀛愭槸浣忔埧璐鋒澶勭悊搴旂敤涓紝澶勭悊鎻愪氦鍒癆US錛圓utomated Underwriting System錛夌殑璐鋒璇鋒眰銆傝捶嬈句漢鎻愪氦璐鋒鐢寵鍚庯紝鎶墊娂鍏徃鍙戦佽姹傚埌AUS鍙栧緱淇$敤鍘嗗彶淇℃伅銆傚洜涓鴻璇鋒眰瑕佸彇寰楃患鍚堣緇嗙殑淇$敤鎶ュ憡濡傝捶嬈句漢褰撳墠鍜岃繃鍘葷殑淇$敤甯愭埛錛屾渶榪戠殑鏀粯浠ュ強鍏跺畠閲戣瀺璇︾粏淇℃伅錛屾墍浠ヤ粠璇鋒眰鍒拌幏寰楀搷搴斿父甯擱渶瑕佸緢闀挎椂闂淬傚瀹㈡埛绔▼搴忔潵璇村紑涓涓埌鏈嶅姟鍣ㄧ殑榪炴帴騫朵笖闀挎椂闂寸瓑寰呭搷搴旀槸娌℃湁鎰忎箟鐨勩備簬鏄氨鏈変簡寮傛閫氫俊錛涗篃灝辨槸錛屼竴鏃﹁姹傝鎻愪氦錛屽畠灝辮鏀懼叆闃熷垪閲岄潰騫朵笖瀹㈡埛鏂紑鏈嶅姟鍣ㄨ繛鎺ャ傜劧鍚庯紝AUS鏈嶅姟浠庣壒瀹氶槦鍒楁憳鍙栬姹傦紝澶勭悊瀹冿紝鎶婄粨鏋滄秷鎭斁鍏ュ彟澶栦竴涓秷鎭槦鍒椼傛渶鍚庡鎴風▼搴忎粠娑堟伅闃熷垪鎽樺彇鍝嶅簲緇撴灉緇х畫澶勭悊淇$敤鍘嗗彶緇撴灉淇℃伅銆?br />
JMS
濡傛灉鐢ㄨ繃JMS鐨勮瘽錛屼細鍙戠幇瀹冪被浼煎啓JDBC鎴朖CA浠g爜銆傚畠鏈夊垱寤烘垨媯绱MS璧勬簮鐨勬牱鏉夸唬鐮侊紝姣忓綋浣犻渶瑕佺紪鍐欎竴涓柊綾繪潵鍙戦佹垨鎺ュ彈娑堟伅鏃訛紝閮藉緱閲嶅緙栧啓閭d釜鏍鋒湰浠g爜銆備笅闈㈠垪鍑轟簡浼犵粺JMS瀹炵幇娑夊強鐨勬楠わ細
1銆佸垱寤篔NDI鍒濆涓婁笅鏂嘽ontext錛?br />2銆佷粠JNDI涓婁笅鏂囪幏寰楅槦鍒楄繛鎺ュ伐鍘傦紱
3銆佷粠闃熷垪榪炴帴宸ュ巶鍙栧緱闃熷垪Queue錛?br />4銆佸垱寤轟竴涓猄ession瀵硅薄錛?br />5銆佸垱寤轟竴涓彂閫佹垨鎺ュ彈瀵硅薄錛?br />6銆佸埄鐢ㄧ5閮ㄥ垱寤虹殑鍙戦佹垨鎺ュ彈瀵硅薄鍙戦佹垨鎺ュ彈娑堟伅錛?br />7銆佸鐞嗗畬娑堟伅鍚庯紝鍏抽棴鎵鏈塉MS璧勬簮銆?br />
濡備綘鎵瑙侊紝鍙湁絎?姝ユ槸澶勭悊娑堟伅鐨勬楠ゃ傚叾浠栨楠ら兘鍙槸綆$悊JMS璧勬簮錛屼笌瀹為檯涓氬姟闇姹傛棤鍏籌紝浣嗗紑鍙戣呬笉寰椾笉緙栧啓鍜岀淮鎶ら偅浜涢檮鍔犳楠や唬鐮併?br />
Spring JMS
Spring妗嗘灦鎻愪緵涓涓ā鏉挎満鍒舵潵闅愯棌Java API緇嗚妭銆侸EE寮鍙戣呭彲鐢↗DBCTemplate 鍜孞NDITemplate綾繪潵鍒嗗埆璁塊棶鍚庣鏁版嵁搴撳拰JEE璧勬簮錛堟暟鎹簮錛岃繛鎺ユ睜錛夈侸MS娌℃湁寮傚父銆係pring鎻愪緵浜咼MSTemplate綾伙紝鎵浠ュ紑鍙戣呬笉蹇呬負JMS瀹炵幇緙栧啓鏍鋒湰浠g爜銆傚綋寮鍙慗MS搴旂敤鏃訛紝Spring鎻愪緵浜嗕竴涓嬩竴浜涗紭鍔匡細
1銆佹彁渚涗簡涓涓狫MS鐨勬娊璞PI錛岀畝鍖栦簡JMS鐨勪嬌鐢ㄣ傚錛氳闂洰鐨勫湴錛堥槦鍒楁垨涓諱綋錛夊拰鍑虹増娑堟伅鍒扮壒瀹氱洰鐨勫湴銆?br />2銆丣EE寮鍙戣呬笉蹇呭叧蹇僇MS涓嶅悓鐗堟湰涔嬮棿鐨勫樊寮傦紙濡侸MS 1.0.2 鍚?JMS 1.1錛夛紱
3銆佸紑鍙戣呬笉蹇呯壒瀹氬湴澶勭悊JMS寮傚父錛屽洜涓篠pring涓篔MS浠g爜鎶涘嚭鐨勪換浣旿MS寮傚父鎻愪緵浜嗕竴涓猽nchecked寮傚父銆?br />
涓鏃︿綘鍦↗MS搴旂敤涓紑濮嬩嬌鐢⊿pring錛屼綘灝嗕細嬈h祻鍒板紓姝ユ秷鎭鐞嗙殑綆鏄撴с係pring JMS妗嗘灦鎻愪緵浜嗗悇縐峧ava綾諱嬌JMS寮鍙戝彉寰楃畝鍗曘?br />
琛?錛孲pring JMS綾?br />
闅忓悗鐨勯儴鍒嗭紝鎴戝皢璇︾粏瑙i噴琛?涓殑綾伙紙濡侸msTemplate, DestinationResolver,鍜?MessageConverter錛夈?br />
JMSTemplate
JmsTemplate鎻愪緵浜嗗嚑涓猦elper鏂規硶鏉ユ墽琛屽熀鏈搷浣溿傚紑濮嬩嬌鐢↗msTemplate鍓嶏紝鏈夊繀瑕佺煡閬揓MS鎻愪緵鑰呮敮鎸佸摢縐岼MS瑙勮寖銆侸Boss AS 4.0.2 鍜?WebLogic 8.1鏈嶅姟鍣ㄦ敮鎸丣MS1.0.2瑙勮寖銆俉ebLogic 鏈嶅姟鍣?9.0鍖呭惈JMS1.1鏀寔銆侸MS1.1緇熶竴浜哖TP鍜孭ub/Sub緙栫▼鎺ュ彛銆傛湁浜嗚繖涓敼鍙橈紝寮鍙戣呭彲浠ュ垱寤轟竴涓簨鍔′細璇濓紝鐒跺悗鍦ㄥ悓涓涓狫MS浜嬪姟涓紝浠嶲ueue錛圥TP錛夋帴鍙楁秷鎭拰鍙戦佷竴涓秷鎭埌Topic錛圥ub/Sub錛夈侸MS1.1鍚戝悗鍏煎JMS1.0錛屽洜姝ゅ熀浜嶫MS1.0緙栧啓鐨勪唬鐮佷粛鐒惰兘璺烰MS1.1宸ヤ綔銆?br />
JmsTemplate鎻愪緵鍚勭鏂規硶鏉ユ帴鏀跺拰鍙戦佹秷鎭傝〃2鏄柟娉曞垪琛ㄣ?br />
琛?銆侸MS妯℃澘鏂規硶
浣跨敤JNDI涓婁笅鏂囧瓨鍌ㄥ拰媯绱㈢洰鐨勫湴銆傚綋閰嶇疆Spring搴旂敤涓婁笅鏂囨椂錛屾垜浠敤JndiObjectFactoryBean鑾峰緱JMS鐩殑鍦板紩鐢ㄣ侱estinationResolver鐢ㄦ潵瑙f瀽鐩殑鍦板悕縐板埌涓涓狫MS鐩殑鍦幫紝褰撳簲鐢ㄦ湁璁稿鐩殑鍦版椂錛岄偅鏄緢鏈夊府鍔╃殑銆侱ynamicDestinationResolver錛堢己鐪丏estinationResolver瀹炵幇錛夌敤浜庤В鏋愬姩鎬佺洰鐨勫湴銆?br />
MessageConverter鎺ュ彛瀹氫箟浜唈ava瀵硅薄鍜孞MS娑堟伅涔嬮棿杞崲鐨勫綰︺備嬌鐢ㄨ漿鎹㈠櫒錛屽簲鐢ㄤ唬鐮佸彲浠ヤ笓娉ㄤ簬涓氬姟瀵硅薄錛屼笉鐢ㄦ搷蹇冨畠鏄浣曚唬琛↗MS娑堟伅鐨勩係impleMessageConverter錛堝拰SimpleMessageConverter102錛夋槸緙虹渷MessageConverter瀹炵幇銆傚畠浠敤浜庡皢String銆佸瓧鑺傛暟緇勶紙(byte[]錛夈丮ap銆丼erializable瀵硅薄鍒嗗埆杞崲鎴怞MS TextMessage銆丣MS BytesMessage錛孞MS MapMessage錛孞MS ObjectMessage銆備綘鍙互緙栧啓MessageConverter鎺ュ彛鐨勫畾鍒跺疄鐜板茍緇撳悎XML緇戝畾妗嗘灦濡侸AXB, Castor, Commons Digester, XMLBeans, 鎴?XStream鏉ヨ漿鎹ML鏂囨。鍒癟extMessage銆?br />
鏍鋒湰搴旂敤
鎴戝皢鐢ㄤ竴涓牱鏈捶嬈懼簲鐢ㄥ鐞嗙郴緇燂紙鍙獿oanProc錛夋潵璇存槑鎬庢牱鍦↗MS搴旂敤涓嬌鐢⊿pring銆備綔涓鴻捶嬈懼鐞嗙殑涓閮ㄥ垎錛孡oanProc鍙戦佽捶嬈捐緇嗚祫鏂欙紙loan ID, borrower name, borrower's SSN, loan expiration date, and loan amount錛変粠AUS緋葷粺璇鋒眰淇¤捶鍘嗗彶銆備負璁╀緥瀛愮畝鍗曚竴鐐癸紝鎴戜滑灝嗗熀浜庝袱涓弬鏁幫細淇$敤璇勫垎鍜岃捶嬈炬暟閲忔潵鑾峰緱淇¤捶鍘嗗彶璇︾粏璧勬枡銆傝鎴戜滑鍋囧畾澶勭悊淇$敤媯鏌ヨ姹傜殑涓氬姟瑙勫垯濡備笅錛?br />1銆佸鏋滆捶嬈炬暟閲忕瓑浜庢垨灝忎簬$500,000錛岄偅涔堣捶嬈句漢蹇呴』鑷沖皯鏈変竴涓済ood鈥濅俊鐢紙渚嬪錛岃捶嬈句漢鐨勪俊鐢ㄨ瘎鍒嗗湪680鍒?99涔嬮棿錛夛紱
2銆佸鏋滆捶嬈炬暟閲忚秴榪?500,000錛岄偅涔堣捶嬈句漢蹇呴』鑷沖皯瑕佹湁涓涓渧ery good鈥濅俊鐢紝榪欐剰鍛充粬/濂圭殑淇$敤璇勫垎瓚呰繃700銆?br />
璐鋒搴旂敤Use Case
璐鋒璇鋒眰澶勭悊Use Case鐢變笅鍒楁楠ょ粍鎴愶細
1銆佺敤鎴峰湪璐鋒鐢寵web欏甸潰杈撳叆璐鋒璇︾粏璧勬枡騫舵彁浜よ捶嬈劇敵璇鳳紱
2銆佺劧鍚庣▼搴忓彂閫佽捶嬈捐緇嗚祫鏂欏埌AUS緋葷粺鍙栧緱淇$敤鍘嗗彶璇︾粏璧勬枡銆傜敤鍙戦佽姹傚埌鍚嶅彨CreditRequestSendQueue鐨勬秷鎭槦鍒楁潵瀹屾垚銆?br />3銆丄US緋葷粺浠庨槦鍒楁憳鍙栬捶嬈捐緇嗚祫鏂欏茍鐢ㄨ捶嬈懼弬鏁版潵浠庢暟鎹簱媯绱俊鐢ㄥ巻鍙蹭俊鎭紱
4銆佺劧鍚嶢US緋葷粺鐢ㄦ壘鍒扮殑璐鋒浜轟俊鐢ㄥ巻鍙蹭俊鎭垱寤轟竴涓柊鐨勬秷鎭茍鍙戦佸埌鍚嶅彨CreditRequestReceiveQueue鐨勬秷鎭槦鍒楋紱
5銆佹渶鍚嶭oanProc浠庢帴鏀舵秷鎭槦鍒楁憳鍙栧搷搴旀秷鎭茍澶勭悊璐鋒鐢寵錛屽喅瀹氱敵璇鋒槸琚牳鍑嗚繕鏄嫆緇濄?br />
搴旂敤涓紝鍦ㄥ悓鏍風殑JBoss MQ server涓厤緗簡涓や釜娑堟伅闃熷垪銆俇se Case鐢ㄥ簭鍒楀浘1琛ㄧず濡備笅錛?br />
鍥?錛氳捶嬈懼鐞嗗簲鐢ㄧ殑搴忓垪鍥?br />
鎶鏈?/span>
琛?鍒楀嚭浜嗕緥瀛愬簲鐢ㄤ腑鐢ㄥ埌鐨勪竴浜涙妧鏈拰寮婧愭鏋?br />
琛?錛孞MS搴旂敤涓敤鍒扮殑妗嗘灦
浣跨敤Hermes 鐨凧MS璧勬簮璁劇疆
涓哄紓姝ュ鐞嗘秷鎭紝棣栧厛錛屾垜浠渶瑕佹秷鎭槦鍒楁潵鍙戦佸拰鎺ユ敹娑堟伅銆傛垜浠湪JBoss涓嬌鐢▁ml閰嶇疆鏂囦歡鍒涘緩娑堟伅闃熷垪騫朵笖鐢↗MS鎺у埗鍙版潵嫻忚闃熷垪璇︾粏璧勬枡銆傛竻鍗?鏄劇ず浜哫ML閰嶇疆鏂囦歡JMS閰嶇疆鐗囨柇銆傦紙榪欎釜鐗囨柇鍙互琚坊鍔犲埌%JBOSS_HOME%\server\all\deploy-hasingleton\jms鐩綍涓嬬殑jbossmq-destinations-service.xml鏂囦歡涓傦級
娓呭崟1錛孞Boss MQ鏈嶅姟鍣ㄤ腑JMS闃熷垪閰嶇疆
<!--聽聽Credit Request Send Queue聽聽-->
<mbean code="org.jboss.mq.server.jmx.Queue"
聽聽name="jboss.mq.destination:service=Queue,name=CreditRequestSendQueue">
聽聽<depends optional-attribute-name="DestinationManager">
聽聽聽聽jboss.mq:service=DestinationManager
聽聽</depends>
</mbean>
<!--聽聽Credit Request Receive Queue聽聽-->
<mbean code="org.jboss.mq.server.jmx.Queue"
聽聽name="jboss.mq.destination:service=Queue,name=CreditRequestReceiveQueue">
聽聽<depends optional-attribute-name="DestinationManager">
聽聽聽聽jboss.mq:service=DestinationManager
聽聽</depends>
</mbean>
鐜板湪錛岃鎴戜滑鐪嬬湅鎬庝箞浣跨敤涓涓彨鍋欻ermes鐨凧MS宸ュ叿嫻忚娑堟伅闃熷垪銆侶ermes鏄竴涓狫ava Swing搴旂敤錛屽畠鑳藉垱寤恒佺鐞嗗拰鐩戞帶JMS鎻愪緵鑰呬腑鐨凧MS destination銆傝繖鏍風殑JMS鎻愪緵鑰呮湁JBossMQ, WebSphereMQ, ActiveMQ 鍜?Arjuna銆備粠website涓嬭澆Hermes騫惰В鍘媧ip鏂囦歡鍒頒竴涓湰鍦扮洰褰?濡俢:\dev\tools\hermes)銆備竴鏃﹀畨瑁咃紝鍙屽嚮hermes.bat (鍦╞in鐩綍)鍚姩紼嬪簭銆?br />
涓哄湪Hermes涓厤緗甁BossMQ鏈嶅姟鍣紝鍙傝僅ermes绔欑偣涓婄殑demo銆傚畠涓姝ヤ竴姝ュ艦璞¤鏄庝簡JBoss MQ鐨勯厤緗傚綋閰嶇疆涓涓柊鐨凧NDI鍒濆涓婁笅鏂囨椂錛岃緭鍏ヤ笅闈㈢殑閰嶇疆淇℃伅銆?br />
鈥roviderURL = jnp://localhost:1099
鈥nitialContextFactory = org.jnp.interfaces.NamingContextFactory
鈥rlPkgPrefixes = org.jnp.interfaces:org.jboss.naming
鈥ecurityCredentials = admin
鈥ecurityPrincipal = admin
褰撳垱寤轟竴涓柊destinations鏃訛紝杈撳叆queue/CreditRequestSendQueue 鍜?queue/CreditRequestReceiveQueue銆傚浘2鏄劇ず浜咼MS鎺у埗鍙頒富灞忓箷錛屽畠鏄劇ず浜嗕負鏍鋒湰JMS搴旂敤鍒涘緩鐨勬柊娑堟伅銆?br />
鍥?.Hermes涓墍鏈塪estinations鐨勬埅灞?br />
鍥?鏄秷鎭彂閫佽呭彂閫佷竴浜涙秷鎭埌CreditRequestSendQueue鍚庯紝Hermes JMS鎺у埗鍙版樉紺虹殑娑堟伅闃熷垪璇︾粏璧勬枡銆備綘鑳界湅鍒拌繖閲岄槦鍒椾腑鏈?涓秷鎭茍涓旀帶鍒跺彴鏄劇ず浜嗘秷鎭殑璇︾粏淇℃伅濡俶essage ID銆乵essage destination銆乼ime stamp銆佸拰瀹為檯鐨勬秷鎭?br />
鍥?.Hermes涓槦鍒楄緇嗚祫鏂欐埅灞?br />
浣跨敤Spring JMS錛屽紓姝ユ秷鎭彉寰楃畝鍗?/span>
鐢ㄥ湪鏍鋒湰搴旂敤涓殑榪欎簺娑堟伅闃熷垪鍚嶅拰鍏跺畠JMS浠ュ強JNDI鍙傛暟濡備笅琛?鎵紺恒?br />
琛?,Spring JMS閰嶇疆鍙傛暟
Spring閰嶇疆
宸茬粡鏈変簡榪愯鏍鋒湰搴旂敤鎵闇鐨凧MS destinations錛岀幇鍦ㄨ鏄繘鍏ョ敤XML Spring閰嶇疆鏂囦歡(鍙仛spring-jms.xml)瑁呴厤JMS緇勪歡鐨勭粏鑺傜殑鏃跺欎簡銆傜敤IOC璁捐妯″紡涓殑setter渚濊禆娉ㄥ叆鍘熺悊瑁呭叆榪欎簺緇勪歡銆傝鎴戜滑浠旂粏鐪嬬湅緇勪歡錛屼負姣忎竴涓狫MS緇勪歡鏄劇ず浜嗕竴涓猉ML閰嶇疆鐗囨柇銆?br />
JNDI涓婁笅鏂囨槸鑾峰彇JMS璧勬簮鐨勫叆鍙o紝鎵浠ユ垜浠鍏堥厤緗竴涓狫NDI妯℃澘銆傛竻鍗?鏄劇ず浜嗕竴鍚嶄負jndiTemplate鐨凷pring bean錛屽畠鍏鋒湁鍙栧緱JNDI鍒濆涓婁笅鏂囧繀欏葷殑甯哥敤鍙傛暟銆?br />
娓呭崟2錛孞NDI涓婁笅鏂囨ā鏉?br />
<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
聽聽聽聽<property name="environment">
聽聽聽聽聽聽聽聽<props>
聽聽聽聽聽聽聽聽聽聽聽聽<prop key="java.naming.factory.initial">
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽org.jnp.interfaces.NamingContextFactory
聽聽聽聽聽聽聽聽聽聽聽聽</prop>
聽聽聽聽聽聽聽聽聽聽聽聽<prop key="java.naming.provider.url">
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽localhost
聽聽聽聽聽聽聽聽聽聽聽聽</prop>
聽聽聽聽聽聽聽聽聽聽聽聽<prop key="java.naming.factory.url.pkgs">
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽org.jnp.interfaces:org.jboss.naming
聽聽聽聽聽聽聽聽聽聽聽聽</prop>
聽聽聽聽聽聽聽聽</props>
聽聽聽聽</property>
</bean>
涓嬩竴姝ワ紝鎴戜滑閰嶇疆闃熷垪榪炴帴宸ュ巶銆傛竻鍗?鏄劇ず浜嗛槦鍒楄繛鎺ュ伐鍘傘?br />
娓呭崟3錛孞MS瀵逛簡榪炴帴宸ュ巶閰嶇疆
<bean id="jmsQueueConnectionFactory"
聽聽聽聽聽聽class="org.springframework.jndi.JndiObjectFactoryBean">
聽聽聽聽<property name="jndiTemplate">
聽聽聽聽聽聽聽聽<ref bean="jndiTemplate"/>
聽聽聽聽</property>
聽聽聽聽<property name="jndiName">
聽聽聽聽聽聽聽聽<value>UIL2ConnectionFactory</value>
聽聽聽聽</property>
</bean>
鎴戜滑瀹氫箟浜嗕袱涓狫MS destinations鏉ュ彂閫佸拰鎺ユ敹娑堟伅銆傛竻鍗?鍜屾竻鍗?鏄劇ず浜嗚繖浜涚粏鑺傘?br />
娓呭崟4錛屽彂閫侀槦鍒楅厤緗?br />
<bean id="sendDestination"
聽聽聽聽class="org.springframework.jndi.JndiObjectFactoryBean">
聽聽聽聽<property name="jndiTemplate">
聽聽聽聽聽聽聽聽<ref bean="jndiTemplate"/>
聽聽聽聽</property>
聽聽聽聽<property name="jndiName">
聽聽聽聽聽聽聽聽<value>queue/CreditRequestSendQueue</value>
聽聽聽聽</property>
</bean>
娓呭崟5錛屾帴鏀墮槦鍒楅厤緗?br />
<bean id="receiveDestination"
聽聽聽聽class="org.springframework.jndi.JndiObjectFactoryBean">
聽聽聽聽<property name="jndiTemplate">
聽聽聽聽聽聽聽聽<ref bean="jndiTemplate"/>
聽聽聽聽</property>
聽聽聽聽<property name="jndiName">
聽聽聽聽聽聽聽聽<value>queue/CreditReqeustReceiveQueue</value>
聽聽聽聽</property>
</bean>
鐒跺悗錛屾垜浠厤緗甁msTemplate緇勪歡銆傛垜浠湪鏍鋒湰搴旂敤涓嬌鐢↗msTemplate102銆備嬌鐢╠efaultDestination灞炴ф潵鎸囧畾JMS destination銆?br />
娓呭崟6錛孞MS template閰嶇疆
<bean id="jmsTemplate"
聽聽聽聽聽聽class="org.springframework.jms.core.JmsTemplate102">
聽聽聽聽<property name="connectionFactory">
聽聽聽聽聽聽聽聽<ref bean="jmsQueueConnectionFactory"/>
聽聽聽聽</property>
聽聽聽聽<property name="defaultDestination">
聽聽聽聽聽聽聽聽<ref bean="destination"/>
聽聽聽聽</property>
聽聽聽聽<property name="receiveTimeout">
聽聽聽聽聽聽聽聽<value>30000</value>
聽聽聽聽</property>
</bean>
鏈鍚庯紝鎴戜滑閰嶇疆鍙戦佸拰鎺ユ敹鑰呯粍浠躲傛竻鍗?鍜屾竻鍗?鏄劇ず浜哠ender 鍜孯eceiver 瀵硅薄閰嶇疆銆?br />
娓呭崟7錛孞MS Sender閰嶇疆
Listing 7. JMS Sender configuration
<bean id="jmsSender" class="springexample.client.JMSSender">
聽聽聽聽<property name="jmsTemplate">
聽聽聽聽聽聽聽聽<ref bean="jmsTemplate"/>
聽聽聽聽</property>
</bean>
娓呭崟8錛孞MS Receiver閰嶇疆
<bean id="jmsReceiver" class="springexample.client.JMSReceiver">
聽聽聽聽<property name="jmsTemplate">
聽聽聽聽聽聽聽聽<ref bean="jmsTemplate"/>
聽聽聽聽</property>
</bean>
嫻嬭瘯鍜岀洃鎺?/span>
鎴戜簺浜嗕竴涓彨鍋歀oanApplicationControllerTest鐨勬祴璇曠被鏉ユ祴璇昄oanProc搴旂敤銆傛垜浠嬌鐢ㄨ繖涓被鏉ヨ緗捶嬈懼弬鏁板拰璋冪敤閭d釜淇$敤璇鋒眰鏈嶅姟綾匯?br />
璁╂垜浠湅鐪嬩嬌鐢ㄤ紶緇烰MS鑰屼笉鐢⊿pring JMS API鐨勬秷鎭彂閫佽呭疄鐜般傛竻鍗?鏄劇ず浜哅essageSenderJMS榪欎釜綾葷殑sendMessage鏂規硶錛岃繖涓被鍏峰浣跨敤JMS API澶勭悊娑堟伅鐨勬墍鏈夊繀欏繪楠ゃ?br />
娓呭崟9錛屼紶緇烰MS瀹炵幇
public void sendMessage() {
聽聽聽聽queueName = "queue/CreditRequestSendQueue";
聽聽聽聽System.out.println("Queue name is " + queueName);
聽聽聽聽/*
聽聽聽聽 * Create JNDI Initial Context
聽聽聽聽 */
聽聽聽聽try {
聽聽聽聽聽聽聽聽Hashtable env = new Hashtable();
聽聽聽聽聽聽聽聽env.put("java.naming.factory.initial",
聽聽聽聽聽聽聽聽聽聽聽聽"org.jnp.interfaces.NamingContextFactory");
聽聽聽聽聽聽聽聽env.put("java.naming.provider.url","localhost");
聽聽聽聽聽聽聽聽env.put("java.naming.factory.url.pkgs",
聽聽聽聽聽聽聽聽聽聽聽聽"org.jnp.interfaces:org.jboss.naming");
聽聽聽聽聽聽聽聽jndiContext = new InitialContext(env);
聽聽聽聽} catch (NamingException e) {
聽聽聽聽聽聽聽聽System.out.println("Could not create JNDI API " +
聽聽聽聽聽聽聽聽聽聽聽聽"context: " + e.toString());
聽聽聽聽}
聽聽聽聽/*
聽聽聽聽 * Get queue connection factory and queue objects from JNDI context.
聽聽聽聽 */
聽聽聽聽try {
聽聽聽聽聽聽聽聽queueConnectionFactory = (QueueConnectionFactory)
聽聽聽聽聽聽聽聽jndiContext.lookup("UIL2ConnectionFactory");
聽聽聽聽聽聽聽聽queue = (Queue) jndiContext.lookup(queueName);
聽聽聽聽} catch (NamingException e) {
聽聽聽聽聽聽聽聽System.out.println("JNDI API lookup failed: " +
聽聽聽聽聽聽聽聽聽聽聽聽e.toString());
聽聽聽聽}
聽聽聽聽/*
聽聽聽聽 * Create connection, session, sender objects.
聽聽聽聽 * Send the message.
聽聽聽聽 * Cleanup JMS connection.
聽聽聽聽 */
聽聽聽聽try {
聽聽聽聽聽聽聽聽queueConnection =
聽聽聽聽聽聽聽聽聽聽聽聽queueConnectionFactory.createQueueConnection();
聽聽聽聽聽聽聽聽queueSession = queueConnection.createQueueSession(false,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽Session.AUTO_ACKNOWLEDGE);
聽聽聽聽聽聽聽聽queueSender = queueSession.createSender(queue);
聽聽聽聽聽聽聽聽message = queueSession.createTextMessage();
聽聽聽聽聽聽聽聽message.setText("This is a sample JMS message.");
聽聽聽聽聽聽聽聽System.out.println("Sending message: " + message.getText());
聽聽聽聽聽聽聽聽queueSender.send(message);
聽聽聽聽} catch (JMSException e) {
聽聽聽聽聽聽聽聽System.out.println("Exception occurred: " + e.toString());
聽聽聽聽} finally {
聽聽聽聽聽聽聽聽if (queueConnection != null) {
聽聽聽聽聽聽聽聽聽聽聽聽try {
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽queueConnection.close();
聽聽聽聽聽聽聽聽聽聽聽聽} catch (JMSException e) {}
聽聽聽聽聽聽聽聽}
聽聽聽聽}
}
鐜板湪錛岃鎴戜滑鐪嬬湅鐢⊿pring瀹炵幇鐨勬秷鎭彂閫佽呫傛竻鍗?0鏄劇ず浜哅essageSenderSpringJMS綾諱腑send鏂規硶浠g爜銆?br />
娓呭崟10錛岀敤Spring API 鐨凧MS瀹炵幇
public void send() {
聽聽聽聽try {
聽聽聽聽聽聽聽聽ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(new String[] {
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽"spring-jms.xml"});
聽聽聽聽聽聽聽聽System.out.println("Classpath loaded");
聽聽聽聽聽聽聽聽JMSSender jmsSender = (JMSSender)appContext.getBean("jmsSender");
聽聽聽聽聽聽聽聽jmsSender.sendMesage();
聽聽聽聽聽聽聽聽System.out.println("Message sent using Spring JMS.");
聽聽聽聽} catch(Exception e) {
聽聽聽聽聽聽聽聽e.printStackTrace();
聽聽聽聽}
}
濡備綘鎵瑙侊紝鎵鏈変笌綆$悊JMS璧勬簮鐩稿叧鐨勮祫婧愭楠ら兘鐢盨pring瀹瑰櫒鐢ㄩ厤緗枃浠跺鐞嗐傛垜浠粎闇瑕佽幏鍙朖MSSender寮曠敤騫朵笖璋冪敤瀹冧笂闈㈢殑sendMessage鍗沖彲銆?br />
緇撹
鏈枃涓紝鎴戜滑鐪嬪埌Spring妗嗘灦濡備綍綆鍖栦簡浣跨敤JMS API鐨勫紓姝ユ秷鎭簲鐢ㄥ紑鍙戠殑宸ヤ綔銆係pring縐昏蛋浜嗘墍鏈塉MS娑堟伅澶勭悊蹇呴』鐨勬牱鏉夸唬鐮侊紝濡傝幏鍙栬繛鎺ュ伐鍘傦紝浠嶫ava浠g爜鍒涘緩闃熷垪鍜屼細璇濆璞″茍鍦ㄨ繍琛屾椂鐢ㄩ厤緗枃浠惰閰嶅畠浠傜敱浜庤繖涓己澶х殑IOC鍘熺悊錛屾垜浠彲浠ヤ笉蹇呬慨鏀笿ava浠g爜渚垮彲鍔ㄦ佷氦鎹MS璧勬簮瀵硅薄銆?br />
鍥犱負寮傛娑堟伅鏄瀯鎴怱OA妗嗘灦鏁翠綋鎵闇鐨勪竴閮ㄥ垎錛孲pring闈炲父閫傚悎鏀懼叆SOA宸ュ叿闆嗐傚悓鏍鳳紝JMS綆$悊宸ュ叿濡侶ermes浣垮緱鍒涘緩錛岀鐞嗗拰鎺у埗JMS璧勬簮鍙樺緱綆鍗曪紝灝ゅ叾瀵圭郴緇熺鐞嗗憳銆?br />
璧勬簮
鏈枃鏍鋒湰浠g爜
Matrix:http://www.matrix.org.cn/
Spring JMS documentation
"1-2-3 Messaging with Spring JMS"
JBoss MQ wiki
Srini Penchikala鏄疐lagstar Bank淇℃伅緋葷粺棰嗗煙闂涓撳銆?/p>