斷點

          每天進步一點點!
          posts - 174, comments - 56, trackbacks - 0, articles - 21

          EJB3.0中的MessageDrivenBean

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

          EJB3.0中MessageDrivenBean:

          1.java消息驅動bean屬于Java消息服務(Java Message Service,簡稱JMS)。

          2.JMS是用于訪問企業消息系統的開發商中心的API。企業消息系統可以協助應用軟件通過網絡進行消息交互。

          3.JMS的編程過程簡單概括為:應用程序A-->(消息)-->Jboss JMS-->(消息)-->應用程序B。應用程序A和應用程序B沒有直接的代碼關聯,兩者實現了解耦。消息傳遞系統的中心就是消息。

          消息驅動Bean(MDB)是設計用來專門處理基于消息請求的組件,它和無狀態Session Bean一樣也使用了實例池技術,容器可以使用一定數量的bean實例并發處理成百上千個JMS消息。正因為MDB具有處理大量并發消息的能力,所以非常適合應用在一些消息網關產品。如果一個業務執行的時間很長,而執行結果無需實時向用戶反饋時,也很適合使用MDB。如訂單成功后給用戶發送一封電子郵件或發送一條短信等。

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

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

          注意:每種模型都通過擴展公用基類來實現。例如,javax.jms.Queue 和javax.jms.Topic都擴展自
          javax.jms.Destination 類。

           

          開發步驟如下:
          一、配置destinations-service.xml文件。
          JBOSS使用一個XML文件配置隊列地址,文件的取名格式應遵循*-service.xml,我取名為
          destinations-service.xml。
          jboss默認的全局JNDI名稱組成為:"queue"+"/"+"目標地址"。
          開始JMS編程前,我們需要先配置消息到達的目標地址(Destination),因為只有目標地址存在了,
          我們才能發送消息到這個地址。由于每個應用服務器關于目標地址的配置方式都有所不同,下面以jboss為例,配置一個queue類型的目標地址。
          <?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>
          注意:任何隊列或主題被部署之前,應用服務器必須先部署Destination Manager Mbean,所有我們
          通過<depends>節點聲明這一依賴。

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

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

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

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

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

          6.根據會話以及目標地址來建立消息生產者MessageProducer(QueueSender和TopicPublisher都擴展自MessageProducer接口):
          MessageProducer producer = session.createProducer(destination);
          TextMessage msg = session.createTextMessage("您好:荊州,這是我的第一個消息驅動Bean");
          producer.send(msg);

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

          一個MDB通常要實現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進行部署。

          五、運行發送消息的java類,此時在console中就可看見結果了。

          六、至此,一個MessageDrivenBean開發就成功了。


          posted @ 2009-03-27 17:43 斷點 閱讀(158) | 評論 (0) 
          主站蜘蛛池模板: 双鸭山市| 洞口县| 宁安市| 高要市| 肇东市| 大关县| 突泉县| 枣庄市| 罗江县| 大名县| 漠河县| 丰镇市| 闵行区| 新兴县| 龙陵县| 威信县| 揭东县| 清远市| 遂川县| 本溪市| 华亭县| 浦北县| 山东省| 河曲县| 喜德县| 岱山县| 镇安县| 福州市| 鹤庆县| 凌海市| 汕头市| 本溪| 南京市| 宁明县| 崇文区| 安徽省| 常宁市| 沙洋县| 江北区| 湘乡市| 封丘县|