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

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

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

    斷點(diǎn)

    每天進(jìn)步一點(diǎn)點(diǎn)!
    posts - 174, comments - 56, trackbacks - 0, articles - 21

    EJB3.0中的MessageDrivenBean

    Posted on 2010-01-13 22:47 斷點(diǎn) 閱讀(365) 評論(0)  編輯  收藏 所屬分類: EJB3.0

    EJB3.0中MessageDrivenBean:

    1.java消息驅(qū)動(dòng)bean屬于Java消息服務(wù)(Java Message Service,簡稱JMS)。

    2.JMS是用于訪問企業(yè)消息系統(tǒng)的開發(fā)商中心的API。企業(yè)消息系統(tǒng)可以協(xié)助應(yīng)用軟件通過網(wǎng)絡(luò)進(jìn)行消息交互。

    3.JMS的編程過程簡單概括為:應(yīng)用程序A-->(消息)-->Jboss JMS-->(消息)-->應(yīng)用程序B。應(yīng)用程序A和應(yīng)用程序B沒有直接的代碼關(guān)聯(lián),兩者實(shí)現(xiàn)了解耦。消息傳遞系統(tǒng)的中心就是消息。

    消息驅(qū)動(dòng)Bean(MDB)是設(shè)計(jì)用來專門處理基于消息請求的組件,它和無狀態(tài)Session Bean一樣也使用了實(shí)例池技術(shù),容器可以使用一定數(shù)量的bean實(shí)例并發(fā)處理成百上千個(gè)JMS消息。正因?yàn)镸DB具有處理大量并發(fā)消息的能力,所以非常適合應(yīng)用在一些消息網(wǎng)關(guān)產(chǎn)品。如果一個(gè)業(yè)務(wù)執(zhí)行的時(shí)間很長,而執(zhí)行結(jié)果無需實(shí)時(shí)向用戶反饋時(shí),也很適合使用MDB。如訂單成功后給用戶發(fā)送一封電子郵件或發(fā)送一條短信等。

    消息有下面幾種類型,他們都是派生自Message接口。
    StreamMessage:一種主體中包含Java基本值流的消息。其填充和讀取均按順序進(jìn)行。
    MapMessage:一種主體中包含一組名-值對的消息。(沒有定義條目順序)
    TextMessage:一種主體中包含Java字符串的消息(例如:XML消息)
    ObjectMessage:一種主體中包含序列化Java對象的消息。
    BytesMessage:一種主體中包含連續(xù)字節(jié)流的消息。

    消息的傳遞模型:
    JMS支持兩種消息傳遞模型:點(diǎn)對點(diǎn)(point-to-point,簡稱PTP)和發(fā)布/訂閱(publish/subscribe,
    簡稱pub/sub)。
    二者有以下區(qū)別:
    1.PTP 消息傳遞模型規(guī)定了一條消息只能傳遞給一個(gè)接收方。采用javax.jms.Queue表示。
    2.Pub/sub 消息傳遞模型允許一條消息傳遞給多個(gè)接收方。采用javax.jms.Topic表示。

    注意:每種模型都通過擴(kuò)展公用基類來實(shí)現(xiàn)。例如,javax.jms.Queue 和javax.jms.Topic都擴(kuò)展自
    javax.jms.Destination 類。

     

    開發(fā)步驟如下:
    一、配置destinations-service.xml文件。
    JBOSS使用一個(gè)XML文件配置隊(duì)列地址,文件的取名格式應(yīng)遵循*-service.xml,我取名為
    destinations-service.xml。
    jboss默認(rèn)的全局JNDI名稱組成為:"queue"+"/"+"目標(biāo)地址"。
    開始JMS編程前,我們需要先配置消息到達(dá)的目標(biāo)地址(Destination),因?yàn)橹挥心繕?biāo)地址存在了,
    我們才能發(fā)送消息到這個(gè)地址。由于每個(gè)應(yīng)用服務(wù)器關(guān)于目標(biāo)地址的配置方式都有所不同,下面以jboss為例,配置一個(gè)queue類型的目標(biāo)地址。
    <?xml version="1.0" encoding="UTF-8"?>
    <server>
       <mbean code="org.jboss.mq.server.jmx.Queue" 

    name="jboss.mq.destination:service=Queue,name=ztfQueue">
          <attribute name="JNDIName">queue/ztfQueue</attribute>
          <depends optional-attribute-

    name="DestinationManager">jboss.mq:service=DestinationManager</depends>
        </mbean>
       <mbean code="org.jboss.mq.server.jmx.Topic" 

    name="jboss.mq.destination:service=Topic,name=ztfTopic">
          <attribute name="JNDIName">topic/ztfTopic</attribute>
          <depends optional-attribute-

    name="DestinationManager">jboss.mq:service=DestinationManager</depends>
        </mbean>
    </server>
    注意:任何隊(duì)列或主題被部署之前,應(yīng)用服務(wù)器必須先部署Destination Manager Mbean,所有我們
    通過<depends>節(jié)點(diǎn)聲明這一依賴。

    二、在java類中發(fā)送消息(用到j(luò)ndi.properties)。
    一般發(fā)送消息有以下步驟:
    1.得到一個(gè)JNDI初始化上下文(Context)
    InitialContext ctx = new InitialContext();

    2.根據(jù)上下文查找一個(gè)連接工廠ConnectionFactory,改連接工廠是由JMS提供的,不需我們自己創(chuàng)建,每個(gè)廠商都為它綁定了一個(gè)全局JNDI,我們通過它的全局JNDI便獲取它;
    QueueConnectionFactory factory = (QueueConnectionFactory)ctx.lookup("ConnectionFactory");

    3.從連接工廠得到一個(gè)連接QueueConnection。
    QueueConnection conn = factory.createQueueConnection();

    4.通過連接來建立一個(gè)會(huì)話(Session);
    QueueSession session = conn.createQueueSession(false,QueueSession.AUTO_ACKNOWLEDGE);
    這句代碼意思是:建立不需要事務(wù)的并且能自動(dòng)確立消息已接收的會(huì)話。

    5.查找目標(biāo)地址:
    Destination destination=(Destination)ctx.lookup("queue/ztfQueue");

    6.根據(jù)會(huì)話以及目標(biāo)地址來建立消息生產(chǎn)者M(jìn)essageProducer(QueueSender和TopicPublisher都擴(kuò)展自MessageProducer接口):
    MessageProducer producer = session.createProducer(destination);
    TextMessage msg = session.createTextMessage("您好:荊州,這是我的第一個(gè)消息驅(qū)動(dòng)Bean");
    producer.send(msg);

    三、采用MessageDrivenBean接收消息。
    當(dāng)容器檢測到bean守候的目標(biāo)地址有消息到達(dá)時(shí),容器調(diào)用onMessage()方法,將消息作為參數(shù)傳入
    MDB。MDB在onMessage()中決定如何處理改消息。你可以使用注解指定MDB監(jiān)聽哪一個(gè)目標(biāo)地址(Destination)。當(dāng)MDB部署時(shí),容器將讀取其中的配置信息。

    一個(gè)MDB通常要實(shí)現(xiàn)MessageListener接口,在接口定義了onMessage()方法。Bean通過它來處理收到的JMS消息。
    @MessageDriven(activationConfig=
    {
     @ActivationConfigProperty

    (propertyName="destinationType",propertyValue="javax.jms.Queue"),
     @ActivationConfigProperty

    (propertyName="destination",propertyValue="queue/ztfQueue"),
     @ActivationConfigProperty(propertyName="acknowledgeMode",propertyValue="Auto-

    acknowledge")
    })
    public class MessageDrivenBean implements MessageListener{
     public void onMessage(Message message) {
      TextMessage msg = (TextMessage)message;
      try {
       System.out.println(msg.getText());
      } catch (JMSException e) {
       e.printStackTrace();
      }
     }
    }

    四、把工程src下的文件打成jar包(用到build.xml),在C:\jboss-5.0.0.GA\server\default\deploy進(jìn)行部署。

    五、運(yùn)行發(fā)送消息的java類,此時(shí)在console中就可看見結(jié)果了。

    六、至此,一個(gè)MessageDrivenBean開發(fā)就成功了。


    posted @ 2009-03-27 17:43 斷點(diǎn) 閱讀(158) | 評論 (0) 
    主站蜘蛛池模板: 日韩在线看片免费人成视频播放| 2048亚洲精品国产| 午夜亚洲国产精品福利| 亚洲精品无码成人片久久| 7x7x7x免费在线观看| 亚洲精品国产高清在线观看| 亚洲精品乱码久久久久久蜜桃不卡| 免费看污成人午夜网站| 一本久久A久久免费精品不卡| 精品亚洲成AV人在线观看| 国产成人精品高清免费| 日韩av无码久久精品免费| 美女裸体无遮挡免费视频网站| 亚洲精品免费在线观看| 亚洲成a人在线看天堂无码| 亚洲成人在线免费观看| 中美日韩在线网免费毛片视频| 亚洲天堂中文字幕在线观看| 亚洲综合色成在线播放| 欧美日韩国产免费一区二区三区| 国产高潮流白浆喷水免费A片 | 亚洲综合一区国产精品| 亚洲国产精品自在在线观看| 成人亚洲综合天堂| 最近免费中文字幕大全| 久草免费手机视频| 无遮挡国产高潮视频免费观看| 日本亚洲精品色婷婷在线影院 | 亚洲片一区二区三区| 国产精品久久久久久久久久免费 | 亚洲黄色免费电影| 久久乐国产精品亚洲综合| 女人18毛片a级毛片免费| 99免费在线观看视频| 老司机精品免费视频| 日韩精品视频在线观看免费| 亚洲狠狠婷婷综合久久| 亚洲a级片在线观看| 亚洲日韩中文字幕天堂不卡| 亚洲国产精品无码久久一线| 亚洲性日韩精品国产一区二区|