<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Jhonney的專欄

       ----人見(jiàn)人愛(ài)
    隨筆 - 49, 文章 - 1, 評(píng)論 - 23, 引用 - 0
    數(shù)據(jù)加載中……

    Spring和Message Bean的整合

    在日常的開發(fā)中,我們會(huì)經(jīng)常使用MQ異步傳遞數(shù)據(jù)。在Java編程中,我們針對(duì)MQ使用JMS和Message Driven Bean。在EJB 2.0中引入了Message Bean,這也是EJB 2.0的得意之處,并且備受歡迎。在Spring中,我們引入JmsTemplate簡(jiǎn)化了MQ的客戶操作,可以很方便地發(fā)布Message,但是Spring并未提供相關(guān)實(shí)現(xiàn)Message Bean的例子。如果Spring能夠以POJO方式實(shí)現(xiàn)Message Bean,那將更加方便。我們知道EJB中的Message Bean雖然簡(jiǎn)單,但是步驟比較繁雜,你需要實(shí)現(xiàn)MessageDrivenBean, MessageListener接口,還需要設(shè)置EJB的配置信息等,然后是deploy,搞得很復(fù)雜。如果Spring能夠提供POJO Message Bean,那就不一樣了。你可以使用Spring的各種特性如IoC、AOP等等。在這里我們將Spring下的Message Bean稱之為MDP(Message-Driven POJO),這也方便下面的引用。

    在進(jìn)行下一步操作之前,我們需要先進(jìn)行環(huán)境設(shè)定,首先需要選擇一款消息中間件軟件,這里我們選擇ActiveMQ。ActiveMQ是一款開源的消息中間件軟件,實(shí)現(xiàn)了JMS 1.1規(guī)范,包含很多的特性,下面就是ActiveMQ的結(jié)構(gòu)圖:



    同時(shí)我們需要使用SpringFramework框架,當(dāng)前版本為1.2.5。準(zhǔn)備好所有的開發(fā)包,我們要在IntelliJ IDEA創(chuàng)建一個(gè)新的項(xiàng)目,包含一個(gè)普通的模塊即可,然后設(shè)定一下classpath即可,關(guān)于項(xiàng)目的詳細(xì)信息,請(qǐng)下載附件中IntelliJ IDEA項(xiàng)目文件。

    MDP的機(jī)制很簡(jiǎn)單,就是完成對(duì)指定的Message Queue或Topic的監(jiān)聽,所以我們需要在Spring的配置文件進(jìn)行設(shè)定:

    1 設(shè)定ConnectionFactory,這里我們采用嵌入式方式運(yùn)行ActiveMQ:


    <bean id="connectionFactory" class="org.activemq.ActiveMQConnectionFactory"> <property name="brokerURL" value="vm://localhost"/>
    <property name="useEmbeddedBroker" value="true"/>
    </bean>

    2 設(shè)定MDP,我們只需創(chuàng)建一個(gè)普通的JavaBean,然后實(shí)現(xiàn)MessageListener,最后在Spring配置文件中進(jìn)行設(shè)定。


    <bean id="HelloMDP" class="net.jetmaven.HelloMDP"/>

    3 將MDP和Queue或Topic關(guān)聯(lián)起來(lái),以下是針對(duì)ActiveMQ的設(shè)定。其中HelloMDP是對(duì)MDP名稱的引用。


    <bean id="activeMQContainer" class="org.activemq.jca.JCAContainer">
    <property name="workManager">
    <bean id="workManager" class="org.activemq.work.SpringWorkManager"/>
    </property>
    <property name="resourceAdapter">
    <bean id="activeMQResourceAdapter" class="org.activemq.ra.ActiveMQResourceAdapter">
    <property name="serverUrl" value="vm://localhost"/>
    </bean>
    </property>
    </bean>
    <bean id="HelloQueueConsumer" factory-method="addConnector" factory-bean="activeMQContainer">
    <property name="activationSpec">
    <bean class="org.activemq.ra.ActiveMQActivationSpec">
    <property name="destination" value="Hello.Queue"/>
    <property name="destinationType" value="javax.jms.Queue"/>
    </bean>
    </property>
    <property name="ref" value="HelloMDP"/>
    </bean>

    4 設(shè)定JmsTemplate,方便JMS客戶段操作。


    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
    <property name="defaultDestinationName" value="Hello.Queue"/>
    <property name="connectionFactory" ref="connectionFactory"/>
    </bean>

    接下來(lái)我們需要?jiǎng)?chuàng)建一個(gè)Spring的JUnit測(cè)試用例,測(cè)試我們?cè)O(shè)定的功能,這里我們只需設(shè)定Spring配置文件位置,然后在測(cè)試方法中引用JmsTemplate,發(fā)送Message進(jìn)行測(cè)試。


    public class SpringTest extends AbstractDependencyInjectionSpringContextTests
    {
    protected String[] getConfigLocations()
    {
    return new String[]{"classpath*:applicationContext.xml"};
    }
    public void testSendMessage() throws Exception
    {
    JmsTemplate jmsTemplate = (JmsTemplate) applicationContext.getBean("jmsTemplate");
    jmsTemplate.send(new MessageCreator()
    {
    public Message createMessage(Session session) throws JMSException
    {
    MapMessage message=session.createMapMessage(); message.setString("name","Jacky");
    return message;
    }
    });
    }
    }

    當(dāng)你運(yùn)行這個(gè)測(cè)試時(shí),你會(huì)發(fā)現(xiàn)測(cè)試的結(jié)果。 總結(jié):通過(guò)以上的設(shè)定,我們就可以完成Spring下的Message Driven Bean的設(shè)定,同EJB的MDB相比,MDP更加簡(jiǎn)單。在上例中,我們以JVM方式啟動(dòng)ActiveMQ,這對(duì)于單個(gè)應(yīng)用(如web應(yīng)用)是非常實(shí)用的,通過(guò)這種方式可以異步發(fā)送消息,這對(duì)應(yīng)用中異步發(fā)送email,特定任務(wù)等,這種方式非常簡(jiǎn)單,原來(lái)比較復(fù)雜的問(wèn)題現(xiàn)在可以很快解決啦。

    posted on 2007-06-20 02:38 Jhonney 閱讀(627) 評(píng)論(0)  編輯  收藏


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 中文亚洲AV片不卡在线观看 | 亚洲嫩草影院在线观看| 亚洲午夜精品在线| 日本一卡精品视频免费 | 中国国产高清免费av片| 99久久免费观看| 久久亚洲精品成人无码网站| 黄色一级视频免费观看| 亚洲高清中文字幕免费| 亚洲精品国产日韩无码AV永久免费网| 久久精品国产精品亚洲毛片| 无码一区二区三区免费| 亚洲国产精品成人| 国产亚洲玖玖玖在线观看| 无码囯产精品一区二区免费| 亚洲邪恶天堂影院在线观看| 国产大片免费网站不卡美女| 国产亚洲精久久久久久无码AV| 国产精品永久免费| 久久精品国产亚洲AV麻豆王友容 | 亚洲狠狠成人综合网| 免费无遮挡无码视频网站| 免费大片av手机看片| 亚洲国产精品无码久久SM| 1000部啪啪毛片免费看| 亚洲伦另类中文字幕| 99国产精品永久免费视频| 国产精品亚洲综合网站| 亚洲精品高清无码视频| 999久久久免费精品国产| 国产精品亚洲专区无码唯爱网| 久久久无码精品亚洲日韩软件| 精品一区二区三区免费毛片爱| 亚洲午夜无码毛片av久久京东热| 免费在线观看毛片| 美女黄网站人色视频免费| 亚洲AV无码国产精品麻豆天美| 在线观看免费人成视频色| 67194在线午夜亚洲| 在线看片v免费观看视频777| 校园亚洲春色另类小说合集|