国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

用Spring JMS使異步消息變得簡(jiǎn)單

2019-11-18 13:41:51
字體:
供稿:網(wǎng)友

  異步處理通信是面向服務(wù)架構(gòu)(SOA)的重要部分,因?yàn)槠髽I(yè)中的許多系統(tǒng)通信,尤其是跟外部系統(tǒng)通信本來就是異步的。java消息服務(wù)(JMS)就是用來編寫異步消息J2EE應(yīng)用的API。使用JMS API的傳統(tǒng)消息實(shí)現(xiàn)涉及到象這樣的一些步驟:查找對(duì)列連接工廠、隊(duì)列資源以及在實(shí)際發(fā)送和接受消息前,創(chuàng)建JMS會(huì)話(JMS session)。

  SPRing framework簡(jiǎn)化了用JEE組件(包括JMS)開發(fā)JMS應(yīng)用的工作。它提供了一個(gè)模板機(jī)制來隱藏典型的JMS實(shí)現(xiàn)細(xì)節(jié),所以開發(fā)者可以專注于消息處理任務(wù)而不用擔(dān)心怎樣創(chuàng)建、訪問和釋放JMS資源。

  本文用一個(gè)運(yùn)行在JBoss MQ server上的簡(jiǎn)單Web應(yīng)用概述了Spring JMS API和怎樣使用它異步處理(發(fā)送和接受)消息。我將對(duì)比JMS實(shí)現(xiàn)的傳統(tǒng)方法和Spring JMS實(shí)現(xiàn)方法,以顯示使用Spring JMS來處理消息是多么的簡(jiǎn)單和靈活。

  異步消息和SOA

  現(xiàn)實(shí)世界中,大多數(shù)Web請(qǐng)求是同步處理的。例如,當(dāng)用戶登陸一個(gè)站點(diǎn),他或她輸入用戶名和口令以及服務(wù)器識(shí)別登陸憑證。假如身份驗(yàn)證成功,程序讓用戶進(jìn)入站點(diǎn)。這里,登陸請(qǐng)求從客戶端被接受后,立即被處理。信用卡授權(quán)也是一個(gè)同步處理的例子;僅當(dāng)服務(wù)器核實(shí)了發(fā)送進(jìn)來的信用卡號(hào)是有效并且該客戶的帳號(hào)有足夠的信用額度后,才答應(yīng)客戶繼續(xù)進(jìn)行下一步動(dòng)作。讓我們來考察一下訂單處理系統(tǒng)中的支付結(jié)算步驟。一旦系統(tǒng)核實(shí)了那個(gè)用戶的信用卡信息是正確的,而且?guī)羯嫌凶銐虻馁Y金,那么不需要等到支付細(xì)節(jié)和轉(zhuǎn)帳最終完成。支付結(jié)算用異步方式處理,如此客戶便可以繼續(xù)進(jìn)行結(jié)帳處理。

  與典型的同步請(qǐng)求相比,異步處理用于需要長(zhǎng)時(shí)間來處理的請(qǐng)求。異步處理的另外一個(gè)例子是住房貸款處理應(yīng)用中,處理提交到AUS(Automated Underwriting System)的貸款請(qǐng)求。貸款人提交貸款申請(qǐng)后,抵押公司發(fā)送請(qǐng)求到AUS取得信用歷史信息。因?yàn)樵撜?qǐng)求要取得綜合具體的信用報(bào)告如貸款人當(dāng)前和過去的信用帳戶,最近的支付以及其它金融具體信息,所以從請(qǐng)求到獲得響應(yīng)經(jīng)常需要很長(zhǎng)時(shí)間。對(duì)客戶端程序來說開一個(gè)到服務(wù)器的連接并且長(zhǎng)時(shí)間等待響應(yīng)是沒有意義的。于是就有了異步通信;也就是,一旦請(qǐng)求被提交,它就被放入隊(duì)列里面并且客戶斷開服務(wù)器連接。然后,AUS服務(wù)從特定隊(duì)列摘取請(qǐng)求,處理它,把結(jié)果消息放入另外一個(gè)消息隊(duì)列。最后客戶程序從消息隊(duì)列摘取響應(yīng)結(jié)果繼續(xù)處理信用歷史結(jié)果信息。

  JMS

  假如用過JMS的話,會(huì)發(fā)現(xiàn)它類似寫JDBC或JCA代碼。它有創(chuàng)建或檢索JMS資源的樣板代碼,每當(dāng)你需要編寫一個(gè)新類來發(fā)送或接受消息時(shí),都得重復(fù)編寫那個(gè)樣本代碼。下面列出了傳統(tǒng)JMS實(shí)現(xiàn)涉及的步驟:

  1、創(chuàng)建JNDI初始上下文context;

  2、從JNDI上下文獲得隊(duì)列連接工廠;

  3、從隊(duì)列連接工廠取得隊(duì)列Queue;

  4、創(chuàng)建一個(gè)Session對(duì)象;

  5、創(chuàng)建一個(gè)發(fā)送或接受對(duì)象;

  6、利用第5部創(chuàng)建的發(fā)送或接受對(duì)象發(fā)送或接受消息;

  7、處理完消息后,關(guān)閉所有JMS資源。

  如你所見,只有第6步是處理消息的步驟。其他步驟都只是治理JMS資源,與實(shí)際業(yè)務(wù)需求無關(guān),但開發(fā)者不得不編寫和維護(hù)那些附加步驟代碼。

  Spring JMS

  Spring框架提供一個(gè)模板機(jī)制來隱藏Java API細(xì)節(jié)。JEE開發(fā)者可用JDBCTemplate 和JNDITemplate類來分別訪問后端數(shù)據(jù)庫(kù)和JEE資源(數(shù)據(jù)源,連接池)。JMS沒有異常。Spring提供了JMSTemplate類,所以開發(fā)者不必為JMS實(shí)現(xiàn)編寫樣本代碼。當(dāng)開發(fā)JMS應(yīng)用時(shí),Spring提供了一下一些優(yōu)勢(shì):

  1、提供了一個(gè)JMS的抽象API,簡(jiǎn)化了JMS的使用。如:訪問目的地(隊(duì)列或主體)和出版消息到特定目的地。

  2、JEE開發(fā)者不必關(guān)心JMS不同版本之間的差異(如JMS 1.0.2 同 JMS 1.1);

  3、開發(fā)者不必特定地處理JMS異常,因?yàn)镾pring為JMS代碼拋出的任何JMS異常提供了一個(gè)unchecked異常。

  一旦你在JMS應(yīng)用中開始使用Spring,你將會(huì)欣賞到異步消息處理的簡(jiǎn)易性。Spring JMS框架提供了各種java類使JMS開發(fā)變得簡(jiǎn)單。

用Spring JMS使異步消息變得簡(jiǎn)單(圖一)
點(diǎn)擊查看大圖

表1,Spring JMS類

  隨后的部分,我將具體解釋表1中的類(如JmsTemplate, DestinationResolver,和 MessageConverter)。   JMSTemplate

  JmsTemplate提供了幾個(gè)helper方法來執(zhí)行基本操作。開始使用JmsTemplate前,有必要知道JMS提供者支持哪種JMS規(guī)范。JBoss AS 4.0.2 和 WebLogic 8.1服務(wù)器支持JMS1.0.2規(guī)范。WebLogic 服務(wù)器 9.0包含JMS1.1支持。JMS1.1統(tǒng)一了PTP和Pub/Sub編程接口。有了這個(gè)改變,開發(fā)者可以創(chuàng)建一個(gè)事務(wù)會(huì)話,然后在同一個(gè)JMS事務(wù)中,從Queue(PTP)接受消息和發(fā)送一個(gè)消息到Topic(Pub/Sub)。JMS1.1向后兼容JMS1.0,因此基于JMS1.0編寫的代碼仍然能跟JMS1.1工作。

  JmsTemplate提供各種方法來接收和發(fā)送消息。表2是方法列表。

用Spring JMS使異步消息變得簡(jiǎn)單(圖二)
點(diǎn)擊查看大圖

表2。JMS模板方法

  使用JNDI上下文存儲(chǔ)和檢索目的地。當(dāng)配置Spring應(yīng)用上下文時(shí),我們用JndiObjectFactoryBean獲得JMS目的地引用。DestinationResolver用來解析目的地名稱到一個(gè)JMS目的地,當(dāng)應(yīng)用有許多目的地時(shí),那是很有幫助的。DynamicDestinationResolver(缺省DestinationResolver實(shí)現(xiàn))用于解析動(dòng)態(tài)目的地。

  MessageConverter接口定義了java對(duì)象和JMS消息之間轉(zhuǎn)換的契約。使用轉(zhuǎn)換器,應(yīng)用代碼可以專注于業(yè)務(wù)對(duì)象,不用操心它是如何代表JMS消息的。SimpleMessageConverter(和SimpleMessageConverter102)是缺省MessageConverter實(shí)現(xiàn)。它們用于將String、字節(jié)數(shù)組((byte[])、Map、Serializable對(duì)象分別轉(zhuǎn)換成JMS TextMessage、JMS BytesMessage,JMS MapMessage,JMS ObjectMessage。你可以編寫MessageConverter接口的定制實(shí)現(xiàn)并結(jié)合xml綁定框架如JAXB, Castor, Commons Digester, XMLBeans, 或 XStream來轉(zhuǎn)換XML文檔到TextMessage。

  樣本應(yīng)用

  我將用一個(gè)樣本貸款應(yīng)用處理系統(tǒng)(叫LoanProc)來說明怎樣在JMS應(yīng)用中使用Spring。作為貸款處理的一部分,LoanProc發(fā)送貸款具體資料(loan ID, borrower name, borrower's SSN, loan eXPiration date, and loan amount)從AUS系統(tǒng)請(qǐng)求信貸歷史。為讓例子簡(jiǎn)單一點(diǎn),我們將基于兩個(gè)參數(shù):信用評(píng)分和貸款數(shù)量來獲得信貸歷史具體資料。讓我們假定處理信用檢查請(qǐng)求的業(yè)務(wù)規(guī)則如下:

  1、假如貸款數(shù)量等于或小于$500,000,那么貸款人必須至少有一個(gè)“good”信用(例如,貸款人的信用評(píng)分在680到699之間);

  2、假如貸款數(shù)量超過$500,000,那么貸款人必須至少要有一個(gè)“very good”信用,這意味他/她的信用評(píng)分超過700。

  貸款應(yīng)用Use Case

  貸款請(qǐng)求處理Use Case由下列步驟組成:

  1、用戶在貸款申請(qǐng)web頁(yè)面輸入貸款具體資料并提交貸款申請(qǐng);

  2、然后程序發(fā)送貸款具體資料到AUS系統(tǒng)取得信用歷史具體資料。用發(fā)送請(qǐng)求到名叫CreditRequestSendQueue的消息隊(duì)列來完成。

  3、AUS系統(tǒng)從隊(duì)列摘取貸款具體資料并用貸款參數(shù)來從數(shù)據(jù)庫(kù)檢索信用歷史信息;

  4、然后AUS系統(tǒng)用找到的貸款人信用歷史信息創(chuàng)建一個(gè)新的消息并發(fā)送到名叫CreditRequestReceiveQueue的消息隊(duì)列;

  5、最后LoanProc從接收消息隊(duì)列摘取響應(yīng)消息并處理貸款申請(qǐng),決定申請(qǐng)是被核準(zhǔn)還是拒絕。

  應(yīng)用中,在同樣的JBoss MQ server中配置了兩個(gè)消息隊(duì)列。Use Case用序列圖1表示如下:

用Spring JMS使異步消息變得簡(jiǎn)單(圖三)
點(diǎn)擊查看大圖

圖1:貸款處理應(yīng)用的序列圖

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 石家庄市| 湖北省| 剑川县| 翁牛特旗| 内江市| 阳信县| 大埔县| 虞城县| 玉门市| 江永县| 定结县| 横山县| 台中市| 宜州市| 辽阳县| 巴中市| 澎湖县| 双鸭山市| 仙桃市| 台江县| 织金县| 图们市| 长汀县| 乐安县| 溧水县| 瑞昌市| 兴城市| 前郭尔| 昂仁县| 南皮县| 禹城市| 托里县| 淮北市| 嘉善县| 湛江市| 通化市| 本溪| 寻乌县| 甘谷县| 鄄城县| 陇西县|