欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
用SpringJMS使異步消息變得簡(jiǎn)單

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

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

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


異步消息和SOA

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

與典型的同步請求相比,異步處理用于需要長(cháng)時(shí)間來(lái)處理的請求。異步處理的另外一個(gè)例子是住房貸款處理應用中,處理提交到AUS(Automated Underwriting System)的貸款請求。貸款人提交貸款申請后,抵押公司發(fā)送請求到AUS取得信用歷史信息。因為該請求要取得綜合詳細的信用報告如貸款人當前和過(guò)去的信用帳戶(hù),最近的支付以及其它金融詳細信息,所以從請求到獲得響應常常需要很長(cháng)時(shí)間。對客戶(hù)端程序來(lái)說(shuō)開(kāi)一個(gè)到服務(wù)器的連接并且長(cháng)時(shí)間等待響應是沒(méi)有意義的。于是就有了異步通信;也就是,一旦請求被提交,它就被放入隊列里面并且客戶(hù)斷開(kāi)服務(wù)器連接。然后,AUS服務(wù)從特定隊列摘取請求,處理它,把結果消息放入另外一個(gè)消息隊列。最后客戶(hù)程序從消息隊列摘取響應結果繼續處理信用歷史結果信息。

JMS

如果用過(guò)JMS的話(huà),會(huì )發(fā)現它類(lèi)似寫(xiě)JDBC或JCA代碼。它有創(chuàng )建或檢索JMS資源的樣板代碼,每當你需要編寫(xiě)一個(gè)新類(lèi)來(lái)發(fā)送或接受消息時(shí),都得重復編寫(xiě)那個(gè)樣本代碼。下面列出了傳統JMS實(shí)現涉及的步驟:
1、創(chuàng )建JNDI初始上下文context;
2、從JNDI上下文獲得隊列連接工廠(chǎng);
3、從隊列連接工廠(chǎng)取得隊列Queue;
4、創(chuàng )建一個(gè)Session對象;
5、創(chuàng )建一個(gè)發(fā)送或接受對象;
6、利用第5部創(chuàng )建的發(fā)送或接受對象發(fā)送或接受消息;
7、處理完消息后,關(guān)閉所有JMS資源。

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

Spring JMS

Spring框架提供一個(gè)模板機制來(lái)隱藏Java API細節。JEE開(kāi)發(fā)者可用JDBCTemplate 和JNDITemplate類(lèi)來(lái)分別訪(fǎng)問(wèn)后端數據庫和JEE資源(數據源,連接池)。JMS沒(méi)有異常。Spring提供了JMSTemplate類(lèi),所以開(kāi)發(fā)者不必為JMS實(shí)現編寫(xiě)樣本代碼。當開(kāi)發(fā)JMS應用時(shí),Spring提供了一下一些優(yōu)勢:
1、提供了一個(gè)JMS的抽象API,簡(jiǎn)化了JMS的使用。如:訪(fǎng)問(wèn)目的地(隊列或主體)和出版消息到特定目的地。
2、JEE開(kāi)發(fā)者不必關(guān)心JMS不同版本之間的差異(如JMS 1.0.2 同 JMS 1.1);
3、開(kāi)發(fā)者不必特定地處理JMS異常,因為Spring為JMS代碼拋出的任何JMS異常提供了一個(gè)unchecked異常。

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


表1,Spring JMS類(lèi)

隨后的部分,我將詳細解釋表1中的類(lèi)(如JmsTemplate, DestinationResolver,和 MessageConverter)。


JMSTemplate

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

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


表2。JMS模板方法

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

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

樣本應用

我將用一個(gè)樣本貸款應用處理系統(叫LoanProc)來(lái)說(shuō)明怎樣在JMS應用中使用Spring。作為貸款處理的一部分,LoanProc發(fā)送貸款詳細資料(loan ID, borrower name, borrower‘s SSN, loan expiration date, and loan amount)從AUS系統請求信貸歷史。為讓例子簡(jiǎn)單一點(diǎn),我們將基于兩個(gè)參數:信用評分和貸款數量來(lái)獲得信貸歷史詳細資料。讓我們假定處理信用檢查請求的業(yè)務(wù)規則如下:
1、如果貸款數量等于或小于$500,000,那么貸款人必須至少有一個(gè)“good”信用(例如,貸款人的信用評分在680到699之間);
2、如果貸款數量超過(guò)$500,000,那么貸款人必須至少要有一個(gè)“very good”信用,這意味他/她的信用評分超過(guò)700。

貸款應用Use Case

貸款請求處理Use Case由下列步驟組成:
1、用戶(hù)在貸款申請web頁(yè)面輸入貸款詳細資料并提交貸款申請;
2、然后程序發(fā)送貸款詳細資料到AUS系統取得信用歷史詳細資料。用發(fā)送請求到名叫CreditRequestSendQueue的消息隊列來(lái)完成。
3、AUS系統從隊列摘取貸款詳細資料并用貸款參數來(lái)從數據庫檢索信用歷史信息;
4、然后AUS系統用找到的貸款人信用歷史信息創(chuàng )建一個(gè)新的消息并發(fā)送到名叫CreditRequestReceiveQueue的消息隊列;
5、最后LoanProc從接收消息隊列摘取響應消息并處理貸款申請,決定申請是被核準還是拒絕。

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


圖1:貸款處理應用的序列圖

技術(shù)

表3列出了例子應用中用到的一些技術(shù)和開(kāi)源框架


表3,JMS應用中用到的框架

使用Hermes 的JMS資源設置

為異步處理消息,首先,我們需要消息隊列來(lái)發(fā)送和接收消息。我們在JBoss中使用xml配置文件創(chuàng )建消息隊列并且用JMS控制臺來(lái)瀏覽隊列詳細資料。清單1顯示了XML配置文件JMS配置片斷。(這個(gè)片斷可以被添加到%JBOSS_HOME%\server\all\deploy-hasingleton\jms目錄下的jbossmq-destinations-service.xml文件中。)

清單1,JBoss MQ服務(wù)器中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>


現在,讓我們看看怎么使用一個(gè)叫做Hermes的JMS工具瀏覽消息隊列。Hermes是一個(gè)Java Swing應用,它能創(chuàng )建、管理和監控JMS提供者中的JMS destination。這樣的JMS提供者有JBossMQ, WebSphereMQ, ActiveMQ 和 Arjuna。從website下載Hermes并解壓zip文件到一個(gè)本地目錄(如c:\dev\tools\hermes)。一旦安裝,雙擊hermes.bat (在bin目錄)啟動(dòng)程序。

為在Hermes中配置JBossMQ服務(wù)器,參考Hermes站點(diǎn)上的demo。它一步一步形象說(shuō)明了JBoss MQ的配置。當配置一個(gè)新的JNDI初始上下文時(shí),輸入下面的配置信息。

?providerURL = jnp://localhost:1099
?initialContextFactory = org.jnp.interfaces.NamingContextFactory
?urlPkgPrefixes = org.jnp.interfaces:org.jboss.naming
?securityCredentials = admin
?securityPrincipal = admin

當創(chuàng )建一個(gè)新destinations時(shí),輸入queue/CreditRequestSendQueue 和 queue/CreditRequestReceiveQueue。圖2顯示了JMS控制臺主屏幕,它顯示了為樣本JMS應用創(chuàng )建的新消息。


圖2.Hermes中所有destinations的截屏


圖3是消息發(fā)送者發(fā)送一些消息到CreditRequestSendQueue后,Hermes JMS控制臺顯示的消息隊列詳細資料。你能看到這里隊列中有5個(gè)消息并且控制臺顯示了消息的詳細信息如message ID、message destination、time stamp、和實(shí)際的消息。


圖3.Hermes中隊列詳細資料截屏


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

用在樣本應用中的這些消息隊列名和其它JMS以及JNDI參數如下表4所示。


表4,Spring JMS配置參數


Spring配置

已經(jīng)有了運行樣本應用所需的JMS destinations,現在該是進(jìn)入用XML Spring配置文件(叫做spring-jms.xml)裝配JMS組件的細節的時(shí)候了。用IOC設計模式中的setter依賴(lài)注入原理裝入這些組件。讓我們仔細看看組件,為每一個(gè)JMS組件顯示了一個(gè)XML配置片斷。

JNDI上下文是獲取JMS資源的入口,所以我們首先配置一個(gè)JNDI模板。清單2顯示了一名為jndiTemplate的Spring bean,它具有取得JNDI初始上下文必須的常用參數。

清單2,JNDI上下文模板
<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>


下一步,我們配置隊列連接工廠(chǎng)。清單3顯示了隊列連接工廠(chǎng)。

清單3,JMS對了連接工廠(chǎng)配置
<bean id="jmsQueueConnectionFactory"
      class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiTemplate">
        <ref bean="jndiTemplate"/>
    </property>
    <property name="jndiName">
        <value>UIL2ConnectionFactory</value>
    </property>
</bean>


我們定義了兩個(gè)JMS destinations來(lái)發(fā)送和接收消息。清單4和清單5顯示了這些細節。

清單4,發(fā)送隊列配置
<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,接收隊列配置
<bean id="receiveDestination"
    class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiTemplate">
        <ref bean="jndiTemplate"/>
    </property>
    <property name="jndiName">
        <value>queue/CreditReqeustReceiveQueue</value>
    </property>
</bean>


然后,我們配置JmsTemplate組件。我們在樣本應用中使用JmsTemplate102。使用defaultDestination屬性來(lái)指定JMS destination。

清單6,JMS 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>


最后,我們配置發(fā)送和接收者組件。清單7和清單8顯示了Sender 和Receiver 對象配置。

清單7,JMS Sender配置
Listing 7. JMS Sender configuration
<bean id="jmsSender" class="springexample.client.JMSSender">
    <property name="jmsTemplate">
        <ref bean="jmsTemplate"/>
    </property>
</bean>


清單8,JMS Receiver配置
<bean id="jmsReceiver" class="springexample.client.JMSReceiver">
    <property name="jmsTemplate">
        <ref bean="jmsTemplate"/>
    </property>
</bean>


測試和監控

我些了一個(gè)叫做LoanApplicationControllerTest的測試類(lèi)來(lái)測試LoanProc應用。我們使用這個(gè)類(lèi)來(lái)設置貸款參數和調用那個(gè)信用請求服務(wù)類(lèi)。

讓我們看看使用傳統JMS而不用Spring JMS API的消息發(fā)送者實(shí)現。清單9顯示了MessageSenderJMS這個(gè)類(lèi)的sendMessage方法,這個(gè)類(lèi)具備使用JMS API處理消息的所有必須步驟。

清單9,傳統JMS實(shí)現
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) {}
        }
    }
}


現在,讓我們看看用Spring實(shí)現的消息發(fā)送者。清單10顯示了MessageSenderSpringJMS類(lèi)中send方法代碼。

清單10,用Spring API 的JMS實(shí)現
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();
    }
}


如你所見(jiàn),所有與管理JMS資源相關(guān)的資源步驟都由Spring容器用配置文件處理。我們僅需要獲取JMSSender引用并且調用它上面的sendMessage即可。

結論

本文中,我們看到Spring框架如何簡(jiǎn)化了使用JMS API的異步消息應用開(kāi)發(fā)的工作。Spring移走了所有JMS消息處理必須的樣板代碼,如獲取連接工廠(chǎng),從Java代碼創(chuàng )建隊列和會(huì )話(huà)對象并在運行時(shí)用配置文件裝配它們。由于這個(gè)強大的IOC原理,我們可以不必修改Java代碼便可動(dòng)態(tài)交換JMS資源對象。

因為異步消息是構成SOA框架整體所需的一部分,Spring非常適合放入SOA工具集。同樣,JMS管理工具如Hermes使得創(chuàng )建,管理和控制JMS資源變得簡(jiǎn)單,尤其對系統管理員。
 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1197235



本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
JMS-Spring
jms中使用spring框架
Spring整合JMS(消息中間件)
Spring對JMS的支持
Doing flex with JMS: combining BlazeDS, sprin...
Spring遠程調用小結
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久