使用SpringJMS輕松實(shí)現(xiàn)異步消息傳遞精品文檔13_第1頁
使用SpringJMS輕松實(shí)現(xiàn)異步消息傳遞精品文檔13_第2頁
使用SpringJMS輕松實(shí)現(xiàn)異步消息傳遞精品文檔13_第3頁
使用SpringJMS輕松實(shí)現(xiàn)異步消息傳遞精品文檔13_第4頁
使用SpringJMS輕松實(shí)現(xiàn)異步消息傳遞精品文檔13_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、使用Spring JMS輕松實(shí)現(xiàn)異步消息傳遞異步進(jìn)程通信是面向服務(wù)架構(gòu)(SOA) 一個重要的組成部分,因為企業(yè)里很 多系統(tǒng)通信,特別是與外部組織間的通信,實(shí)質(zhì)上都是異步的。Java消息服務(wù)(JMS)是用于編寫使用異步消息傳遞的 JEE應(yīng)用程序的API。傳統(tǒng)的使用JMS API進(jìn)行消息傳遞的實(shí)現(xiàn)包括多個步驟,例如 JNDI查詢隊列連接工廠和Queue 資源,在實(shí)際發(fā)送和接收消息前創(chuàng)建一個 JMS會話。Spring框架則簡化了使用JEE組件(包括JMS)的任務(wù)。它提供的模板機(jī) 制隱藏了典型的JM迎現(xiàn)的細(xì)節(jié),這樣開發(fā)人員可以集中精力放在處理消息的 實(shí)際工作中,而不用擔(dān)心如何去創(chuàng)建,訪問或清除 JM砥

2、源。本文將對Spring JMS API作一個概述,并通過一個運(yùn)行在 JBoss MQ服 務(wù)器上的web例程來介紹如何使用Spring JMS API來異步處理(發(fā)送和接收) 消息。我將通過傳統(tǒng)JM斂現(xiàn)和Spring JMS實(shí)現(xiàn)兩者間的比較,來展示使用 Spring JMS處理消息是如何的簡單和靈活。異步消息傳遞和面向服務(wù)架構(gòu)在現(xiàn)實(shí)中,大多數(shù)web請求都是同步處理的。例如,當(dāng)用戶要登入一個 網(wǎng)站,首先輸入用戶名和密碼,然后服務(wù)器驗證登錄合法性。如果驗證成功, 程序?qū)⒃试S該用戶進(jìn)入網(wǎng)站。這里,登錄請求在從客戶端接收以后被即時處理 了。信用卡驗證是另一個同步處理的例子;只有服務(wù)器證實(shí)輸入的信用卡號

3、是 有效的,同時客戶在帳戶上有足夠的存款,客戶才被允許繼續(xù)操作。但是讓我 們思考一下在順序處理系統(tǒng)上的支付結(jié)算步驟。一旦系統(tǒng)證實(shí)該用戶信用卡的 信息是準(zhǔn)確的,并且在帳戶上有足夠的資金,就不必等到所有的支付細(xì)節(jié)落實(shí)、 轉(zhuǎn)賬完成。支付結(jié)算可以異步方式進(jìn)行,這樣客戶可以繼續(xù)進(jìn)行核查操作。需要比典型同步請求耗費(fèi)更長時間的請求,可以使用異步處理。另一個 異步處理的例子是,在本地貸款處理程序中,提交至自動承銷系統(tǒng)(AUS)的信用請求處理過程。當(dāng)借方提交貸款申請后,抵押公司會向AUS®送請求,以獲取信用歷史記錄。由于這個請求要求得到全面而又詳細(xì)的信用報告,包括借方 現(xiàn)今和過去的帳戶,最近的付款和其

4、他財務(wù)資料,服務(wù)器需要耗費(fèi)較長的時間 (幾小時或著有時甚至是幾天)來對這些請求作出響應(yīng)??蛻舳顺绦颍☉?yīng)用)要與 服務(wù)器連接并耗費(fèi)如此長的時間來等待結(jié)果,這是毫無意義的。因此通信應(yīng)該 是異步發(fā)生的;也就是,一旦請求被提交,它就被放置在隊列中,同時客戶端與服務(wù)器斷開連接。然后 AUS服務(wù)從指定的隊列中選出請求進(jìn)行處理,并將處 理得到的消息放置在另一個消息隊列里。最后,客戶端程序從這個隊列中選出 處理結(jié)果,緊接著處理這個信用歷史數(shù)據(jù)。JMS如果您使用過JMS弋碼,您會發(fā)現(xiàn)它與JDBCE JCA很像。它所包含的樣 本代碼創(chuàng)建或JMSS源對象回溯,使得每一次您需要寫一個新類來發(fā)送和接收 消息時,都具有更

5、好的代碼密集性和重復(fù)性。以下序列顯示了傳統(tǒng)JMS實(shí)現(xiàn)所包括的步驟:創(chuàng)建JNDI初始上下文(context)。從JNDI上下文獲取一個隊列連接工廠。從隊列連接工廠中獲取一個Quene創(chuàng)建一個Session對象。創(chuàng)建一個發(fā)送者(sender)或接收者(receiver) 對象。使用步驟5創(chuàng)建的發(fā)送者或接收者對象發(fā)送或接收消息。處理完消息后,關(guān)閉所有JM砥源。您可以看到,步驟6是處理消息的唯一地方。其他步驟都只是管理與實(shí) 際業(yè)務(wù)要求無關(guān)的JM砥源,但是開發(fā)人員必須編寫并維護(hù)這些額外步驟的代 碼。Spring JMS Spring 框架提供了一個模板機(jī)制來隱藏 Java APIs的細(xì)節(jié)。 JEE開發(fā)人

6、員可以使用JDBCTemplate和JNDITemplate類來分別訪問后臺數(shù)據(jù) 庫和JEE資源(數(shù)據(jù)源,連接池)。JMS也不例外。Spring提供JMSTemplate類, 因此開發(fā)人員不用為一個JMS實(shí)現(xiàn)去編寫樣本代碼。接下來是在開發(fā) JMS應(yīng)用 程序時Spring所具有一些的優(yōu)勢。提供JMSW象API,簡化了訪問目標(biāo)(隊列或主題)和向指定目標(biāo)發(fā)布消息 時JMS的使用。JEE開發(fā)人員不需要關(guān)心JM2同版本(例如JMS 1.0.2與JMS 1.1)之間 的差異。開發(fā)人員不必專門處理JMS#常,因為Spring為所有JM附常提供了一 個未經(jīng)檢查的異常,并在JMS弋碼中重新拋出。一旦您在JMS應(yīng)

7、用程序中開始使用Spring ,您將會欣賞到它在處理異步 消息傳遞上的簡便。Spring JMS框架提供多種Java類,可以輕松實(shí)現(xiàn)JMS應(yīng) 用。表1列出了這些類的一部分。表1.Spring JMS 類類名包功能 JmsException org.springframework.jms只要發(fā)生一個 JMS異常,Spring框架就會拋出異常,這個類是這些所拋出的異常的基(抽象)類。JmsTemplate,JmsTemplate102 org.springframework.jms.core這些是輔助類,用于簡化JMS的使用,處理JM砥源(如連接工廠,目標(biāo)和發(fā)送者/接收者對象) 的創(chuàng)建和釋放。Jm

8、sTemplate102是JmsTemplate的子類,使用 JMS1.0.2規(guī)范 MessageCreator org.springframework.jms.core 這是 JmsTemplate 類使用的 回叫接口,它為指定的會話創(chuàng)建 JMS?肖息MessageConverter org.springframework.jms.support.converter這個接口充當(dāng)個抽象, 用來在Java對象與乂8?肖息之間進(jìn)行轉(zhuǎn)換。DestinationResolver org.springframework.jms.support.destination 這是 JmsTemplate 用來解

9、析 目標(biāo)名的接口。該接口的默認(rèn)實(shí)現(xiàn)是DynamicDestinationResolver 和JndiDestinationResolve在接下來的部分,我將詳細(xì)解釋表1所列的一部分類(例如JmsTemplate,DestinationResolver 和 MessageConverter)。JMSTemplate JmsTemplate提供了幾種輔助方法,用來執(zhí)行一些基本操作。 要開始使用JmsTemplate前,您需要知道JMS供應(yīng)商支持哪個JMS規(guī)范, JBoss AS 4.0.2 和 WebLogic 8.1 服務(wù)器支持 JMS 1.0.2 規(guī)范。WebLogic Server 9.0

10、包括了對JMS 1.1規(guī)范的支持。JMS 1.1統(tǒng)一了點(diǎn)對點(diǎn)(PTP)和發(fā) 布/訂閱(Pub/Sub)域的編程接口。這種改變的結(jié)果就是,開發(fā)人員可以創(chuàng)建一 個事務(wù)會話,然后在這同一個 JM話里,可以從一個 Queue(PTP升接收消 息,同時發(fā)送另一個消息到一個 Topic(Pub/Sub) 。JMS 1.1向后兼容JMS 1.0, 應(yīng)此根據(jù)JMS 1.0編寫的代碼仍可以適用于 JMS 1.1。JmsTemplate提供多種發(fā)送和接收消息的方法。表 2列出了這些方法的一 部分。表 2.JMS template 方法方法名稱功能send發(fā)送消息至默認(rèn)或指定的目標(biāo)。JmsTemplate包含 se

11、nd方法,它通過javax.jms.Destination 或JNDI查詢來指定目標(biāo)。 receive從默認(rèn)或指定的目標(biāo)接收消息,但只會在指定的時間后傳遞消息。我們可以通過receiveTimeout屬性指定超時時間。convertAndSend這個方法委 托MessageConverter接口實(shí)例處理轉(zhuǎn)換過程,然后發(fā)送消息至指定的目標(biāo)。 receiveAndConvert從默認(rèn)或指定的目標(biāo)接收消息。并將消息轉(zhuǎn)換為Java對象。目標(biāo)可以通過JNDI上下文保存和獲取。當(dāng)配置 Spring程序上下文 (application context) 時,我們可以用 JndiObjectFactoryBe

12、an 類取得對 JMS的引用。DestinationResolver 接口是用來把目標(biāo)名稱解析成 JMS目標(biāo), 當(dāng)應(yīng)用程序存在大量目標(biāo)時,這是非常有用的。 DynamicDestinationResolver(DestinationResolver 的默認(rèn)實(shí)現(xiàn))是用來解析 動態(tài)目標(biāo)的。MessageConverter接口定義了將Java對象轉(zhuǎn)換為JMS消息的約定。通過 這個轉(zhuǎn)換器,應(yīng)用程序代碼可以集中于處理事務(wù)對象,而不用為對象如何表示 為JMS?肖息這樣的內(nèi)部細(xì)節(jié)所困饒。SimpleMessageConverter(和 SimpleMessageConverter102)是 MessageC

13、onverter 的默認(rèn)實(shí)現(xiàn)??墒褂盟鼈?分別將String 轉(zhuǎn)換為JMS TextMessage,字節(jié)數(shù)組(byte)轉(zhuǎn)換為JMS BytesMessage, Map轉(zhuǎn)換為 JMS MapMessage 和 Serializable對象轉(zhuǎn)換為JMS ObjectMessage。您也可以編寫自定義的 MessageConverter實(shí)例,通過 XMUW定框架(例如 JAXB Castor , Commons Digester, XMLBean或 XStream), 來實(shí)現(xiàn)XMLt檔到TextMessage對象的轉(zhuǎn)換。小例程序我將用一個貸款申請?zhí)幚硐到y(tǒng)(命名為LoanProc)示例來演示如何在J

14、MS 應(yīng)用程序中使用Spring。作為貸款申請的一部分,LoanProc通過發(fā)送貸款詳 情(貸款I(lǐng)D,借方名字,借方的SSN貸款期限和貸款數(shù)額),從AUS系統(tǒng)獲得 信用歷史詳情。為了簡便起見,我們基于兩個基本參數(shù)來表示信用歷史詳情: 信用分?jǐn)?shù)(又名FICO得分)和貸款數(shù)額。讓我們假設(shè)處理信用檢查請求是按以 下業(yè)務(wù)規(guī)則進(jìn)行的:如果貸款數(shù)額等于或低于,000 ,借方必須至少有一個"好”的信用(也就是, 借方的FICO得分在680到699之間)。如果貸款數(shù)額高于,000,借方必須至少有"很好”的信用,意味著借方的 信用得分要高于700。貸款申請使用案例信用請求處理使用案例包括以下

15、幾個步驟:用戶在貸款申請頁面輸入貸款詳情并提交貸款申請。發(fā)送請求到一個名為CreditRequestSendQueue的消息隊列。然后程序發(fā)送貸款詳情到AU繇統(tǒng),獲取信用歷史詳情。AUS系統(tǒng)從隊列中挑出貸款詳情,并使用貸款參數(shù)從它的數(shù)據(jù)庫中獲取信 用歷史信息。然后AUSa找到的借方的信用歷史信息創(chuàng)建一個新的消息,發(fā)送到一個 新的名為CreditRequestReceiveQueue的消息隊列。最后,LoanProc從接收隊列中選出響應(yīng)消息,處理貸款申請來決定是否 批準(zhǔn)或否決申請。在這個例程中,兩個消息隊列都配置在同一個JBoss MQ server上。使用案例用圖1的序列圖(SequenceD

16、iagram)表示圖1.貸款處理程序的序列圖下面的表3顯示了在例程中我所使用的不同技術(shù)和開源框架,并按應(yīng)用 邏輯層排列。表3.在JMS應(yīng)用程序中使用的框架邏輯層技術(shù) / 框架 MVC Spring MVC Service Spring Framework(version2.1)JMS API Spring JMS JMS Provider JBoss MQ(version 4.0.2)JMS Console Hermes IDE Eclipse 3.1使用Hermes設(shè)置JMSS?源為了異步處理消息,首先我們需要消息隊列發(fā)送和接收消息。我們可以用Jboss里的配置XML±件創(chuàng)建一個新

17、的消息隊列,然后使用JMS控制臺瀏覽隊列的詳細(xì)情況。清單1顯示了配置JMS的XMLK置代碼片斷(這個應(yīng)該加入 至U jbossmq-destinations-service.xml文件,位T%JBOSS_HOME%serverlldeploy-hasingletonjm 文件夾下。)清單I.JBoss MQ Server上JMW歹用勺配置! -Credit Request Send Queue-mbean code="org.jboss.mq.server.jmx.Queue"name="jboss.mq.destination service=Queue,nam

18、e=CreditRequestSendQueue"depends optional-attribute-name="DestinationManager"第5頁jboss.mq : service=DestinationManager/depends /mbean! -Credit Request Receive Queue-mbean code="org.jboss.mq.server.jmx.Queue”name="jboss.mq.destinationservice=Queue,name=CreditRequestReceiveQueu

19、e”depends optional-attribute-name="DestinationManager"jboss.mq : service=DestinationManager/depends/mbean現(xiàn)在,讓我們看看如何使用一個名為Hermes的JMS工具來瀏覽消息隊列,Hermes是一個Java Swing應(yīng)用程序,它可以創(chuàng)建、管理和監(jiān)視JMSS供商(例如 JBossMQ WebSphereMQActiveMQ 和 Arjuna 服務(wù)器)里的 JMS目標(biāo)。從 它的網(wǎng)站上下載Hermes,解壓縮.zip文件到本地目錄(例如,c: dev oolshermes)。一

20、旦安裝完成,雙擊文件 hermes.bat(位于bin文件夾下)啟動 程序。要在Hermes里配置JBossMCffi務(wù)器,請參考Hermes網(wǎng)站上的這個演示 它有著出色的step-by-step 可視化指示來配置JBoss MQ當(dāng)配置一個新的 JNDI初始上下文時,請輸入下面的信息。providerURL=jnp : /localhost : 1099initialContextFactory=erfaces.NamingContextFactory urlPkgPrefixes=erfaces : org.jboss.naming securit

21、yCredentials=admin securityPrincipal=admin當(dāng)您創(chuàng)建新的目標(biāo)時,請輸入 queue/CreditRequestSendQueue和 queue/CreditRequestReceiveQueue 。圖 2 顯示了 JMS空制臺的主窗口,其中 有為JMS例程創(chuàng)建的新的消息隊列。圖2.Hermes中所有目標(biāo)的截圖下面的圖3顯示了在從消息發(fā)送者類發(fā)送消息到CreditRequestSendQueue后,Hermes JMS空制臺及消息隊列的截圖。您可以看見有5個消息在隊列中,控制臺顯示了消息詳情,例如消息ID,消息目標(biāo),時間戳和實(shí)際的消息內(nèi)容。圖3.Herme

22、s中所有隊列的截圖在例程中使用的隊列名稱和其他 JM*口 JNDI參數(shù)見表4。表4.Spring JMS配置參數(shù)參數(shù)名稱參數(shù)值Initial Context Factory erfaces.NamingContextFactory Provider URL localhost: 8080Initial Context Factory URL Packages erfacesorg.jboss.naming Queue Connection Factory UIL2ConnectionFactory Queue Namequeue/CreditRequ

23、estSendQueue,queue/CreditRequestReceiveQueue Spring配置既然我們已經(jīng)有了運(yùn)行例程所需要的JMS目標(biāo),現(xiàn)在該了解用XMLSpring配置文件(名為spring-jms.xml) 來組配JMSS件的具體細(xì)節(jié)了。這些 組件是根據(jù)Inversion of Controller(IOC)設(shè)計模式里的設(shè)置方式注入原則(setter injection principle) ,用JMS對象實(shí)例類組配的。讓我們詳細(xì)查看 這些組件,并為每一個JMS&件演示一段XML配置代碼。JNDI上下文是取得JM砥源的起始位置,因此首先我們要配置JNDI模板.清單2顯

24、示了名為jndiTemplate 的Spring bean ,其中列有JNDI初始上下文 所必需的常用參數(shù)。清單2.JNDI上下文模板beanid="jndiTemplate"class="org.springframework.jndi.JndiTemplate”property name="environment"props prop key="java.naming.factory.initial”erfaces.NamingContextFactory/prop prop key="java.n

25、vider.url” localhost/prop prop key="java.naming.factory.url.pkgs"erfaces : org.jboss.naming/prop/props/property/bean接著,我們配置隊列連接工廠。清單3顯示了隊列連接工廠的配置清單3.JMS隊列連接工廠配置bean id="jmsQueueConnectionFactory”class="org.springframework.jndi.JndiObjectFactoryBean”property na

26、me="jndiTemplate”ref bean="jndiTemplate"/property property name="jndiName”value UIL2ConnectionFactory/value/property/bean我們定義2個JMS目標(biāo)來發(fā)送和接收消息。詳情見清單 4和5。清單4.發(fā)送隊列配置bean id="sendDestination”class="org.springframework.jndi.JndiObjectFactoryBean”property name="jndiTempla

27、te”ref bean="jndiTemplate"/property property name="jndiName"value queue/CreditRequestSendQueue/value/property/bean清單5.接收隊列配置bean id="receiveDestination”class="org.springframework.jndi.JndiObjectFactoryBean”property name="jndiTemplate”ref bean="jndiTemplate&quo

28、t;/property property name="jndiName”value queue/CreditReqeustReceiveQueue/value/property/bean然后我們再來配置JmsTemplate組件。在例程中我們使用 JmsTemplate102。同時使用 defaultDestination 屬性來指定 JMS目標(biāo)。清單6.JMS模板配置bean id="jmsTemplate"class="org.springframework.jms.core.JmsTemplate102”property name="co

29、nnectionFactory”ref bean="jmsQueueConnectionFactory"/property property name="defaultDestination"ref bean="destination"/property property name="receiveTimeout”value 30000/value/property/bean最后我們配置發(fā)送者和接收者組件。清單 7和8分別是Sender和 Receiver對象的配置。清單7.JMS Sender配置bean id="

30、;jmsSender"class="springexample.client.JMSSender"property name="jmsTemplate"ref bean="jmsTemplate"/property/bean清單 8.JMS Receiver 配置第9頁bean id="jmsReceiver"class="springexample.client.JMSReceiver”property name="jmsTemplate”ref bean="jmsTemp

31、late"/property/bean測試及監(jiān)視我寫了一個測試類,命名為 LoanApplicationControllerTest ,用來測試 LoanProc程序。我們可以使用這個類來設(shè)定貸款參數(shù)以及調(diào)用信用請求服務(wù) 類。讓我們看一下不使用Spring JMS API而使用傳統(tǒng)JMS開發(fā)途徑的消息發(fā) 送者實(shí)例。清單9顯示了 MessageSenderJMS1里的sendMessage方法,其中 包含了使用JMS API處理消息的所有必需步驟。清單9.傳統(tǒng)JMS實(shí)例public void sendMessage()queueName="queue/CreditReques

32、tSendQueue"System.out.println("Queue name is"+queueName) ;*Create JNDI Initial ContexttryHashtable env=new Hashtable() ;env.put("java.naming.factory.initial","erfaces.NamingContextFactory") ;env.put("vider.url","localhost&qu

33、ot;);env.put("java.naming.factory.url.pkgs","erfaces : org.jboss.naming") ;jndiContext=new InitialContext(env) ;catch(NamingException e)System.out.println("Could not create JNDI API"+"context : "+e.toString() ;第10頁*Get queue connection factory and q

34、ueue objects from JNDI context.tryqueueConnectionFactory=(QueueConnectionFactory)jndiContext.lookup("UIL2ConnectionFactory") ;queue=(Queue)jndiContext.lookup(queueName);catch(NamingException e)System.out.println("JNDI API lookup failed : "+ e.toString() ;*Create connection,sessio

35、n,sender objects.*Send the message.*Cleanup JMS connection.tryqueueConnection=queueConnectionFactory.createQueueConnection() ;queueSession=queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE) queueSender=queueSession.createSender(queue);message=queueSession.createTextMessage(); message.setText("This is asample JMS message.") ; System.out.println("Sending mess

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論