EJB3.0 EJB開發消息驅動bean

(7)EJB3.0 EJB開發消息驅動bean JMScss

  一: Java消息服務(Java Message Service)html

  630x320

  二:jms中的消息java

  消息傳遞系統的中心就是消息。一條 Message 由三個部分組成:
            頭(header),屬性(property)和主體(body)。

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


    消息的傳遞模型
             JMS 支持兩種消息傳遞模型:點對點(point-to-point,簡稱 PTP)和發佈/訂閱(publish/subscribe,簡稱 pub/sub)。這兩種消息傳遞模型很是類似,但有如下區別:

             PTP 消息傳遞模型規定了一條消息只能傳遞給一個接收方。 採用javax.jms.Queue 表示。
             Pub/sub 消息傳遞模型容許一條消息傳遞給多個接收方。採用javax.jms.Topic表示

            這兩種模型都經過擴展公用基類來實現。例如:javax.jms.Queue 和javax.jms.Topic 都擴展自javax.jms.Destination 類。編程

  點對點模型:
session

  523x197

  發佈或訂閱模式:
併發

  578x281

  三:   配置目標地址app

            開始JMS編程前,咱們須要先配置消息到達的目標地址(Destination),由於只有目標地址存在了,咱們才能發送消息到這個地址。因爲每一個應用服 務器關於目標地址的配置方式都有所不一樣,下面以jboss爲例,配置一個queue類型的目標地址。ide

  663x331

  本文用的配置地址:將這個文件在 jboss中發佈。
學習


     目標地址itmQueue發佈前,必須先發布目標地址的管理器DestinationManager,因此採用依賴元素depends申明這個依賴。

      它發佈的過程,和數據源和EJB都是同樣的。只需把它拷貝到JBoss的server/default/deploy目錄下就好了。 拷貝完後就能夠在JBoss控制檯看到信息:
[itcastQueue] Bound to JNDI name: queue/itmQueue
測試

       說明目標地址itcastQueue綁定了queue/itcastQueue這個監單名稱裏面去。
    queue/itcastQueue這個監單名稱前面並無java:,也就是說這個名稱是在全局命名空間裏面的,它能夠被外部應用進行訪問。
     發佈完後也能夠進入JBoss管理後臺,找到jboss.mq.destination這個欄目,找到剛纔所發佈的目標地址 name=itcastQueue.service=Queue,點擊進去能夠看到裏面的一些信息。

    四:當目標地址創建好了以後,就能夠進行消息的發送。

    在java類中發送消息,通常發送消息有如下步驟:

            (1) 獲得一個JNDI初始化上下文(Context)
              InitialContext ctx = new InitialContext();
          (2) 根據上下文查找一個鏈接工廠 QueueConnectionFactory 。該鏈接工廠是由JMS提供的,不需咱們本身建立,每一個廠商都爲它綁定了一個全局JNDI,咱們經過它的全局JNDI即可獲取它;
           QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("QueueConnectionFactory");
          (3) 從鏈接工廠獲得一個鏈接 QueueConnection
                         conn = factory.createQueueConnection();
           (4) 經過鏈接來創建一個會話(Session);
                     session = conn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
                   這句代碼意思是:創建不須要事務的而且能自動確認消息已接收的會話。
           (5) 查找目標地址:
                     例子對應代碼:Destination destination = (Destination ) ctx.lookup("queue/foshanshop");
           (6) 根據會話以及目標地址來創建消息生產者MessageProducer (QueueSender和TopicPublisher都擴展自MessageProducer接口)

  
例子對應代碼:

  第一種方式:

  運行QueueSender,往目標地址發送一條消息。
    消息發送完後,就能夠編寫消息的接收者。

    採用消息驅動Bean (Message Driven Bean)接收消息。

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

    一個MDB一般要實現MessageListener接口,該接口定義了onMessage()方法。Bean經過它來處理收到的JMS消息。


        當容器檢測到bean守候的目標地址有消息到達時,容器調用onMessage()方法,將消息做爲參數傳入MDB。MDB在onMessage()中決 定如何處理該消息。你可使用註釋指定MDB監聽哪個目標地址(Destination)。當MDB部署時,容器將讀取其中的配置信息。

  消息驅動Bean (Message Driven Bean):




jndi:

  java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=localhost\:1099

  消息驅動bean開發完後,就要對它進行打包,部署。

    編寫build.xml,而後把消息驅動bean發佈到JBoss中。當消息驅動bean成功發佈完以後,正常狀況下會在控制檯中把剛纔發送的消息打印到控制檯中。

      消息驅動bean一旦佈署到JBoss中的時候,容器就會根據bean所配置的信息到目標地址獲取到消息,而後傳入到onMessage方法裏面去,執行方法裏面的內容。

     經過這個例子也能夠發現,JMS編程能夠容許發送者和接收方能夠不一樣時在線。也就是說發送消息的時候,消息接收方能夠不在線。只要消息接收方登陸到系統的 時候,它也能夠獲取到消息。並且消息接收方和消息發送方它們之間並無代碼的直接關聯。二者之間實現很好的解耦。

   

  build.xml

            關於Queue類型的發送和接收就已經介紹完了,如今開始學習下關於topic類型的消息發送和接收。也就是發佈/訂閱傳遞模型的消息發送和接受。在這種模型裏,消息是能夠被多個接收方進行接受的。

  第二種方式:發佈/訂閱傳遞模型的消息發送和接受

  922x327



  操做步驟:

  首先啓動jboss,接着把itm-service.xml 發佈。

  接着:build.xml發佈。

  
     這兩個消息驅動 bean都開發完了,它們兩個都會從目標地址裏面獲取到消息,如今對它進行發佈。 可是在控制檯並無看到剛纔發送的topic消息,那是由於對於topic類型的消息,若是當時接收方沒有監聽topic類型的消息的話,那麼它就獲取不 到消息。儘管咱們把它佈署到JBoss中,由於它當時並無監聽topic這個目標地址,因此它是沒法獲得消息的。
    如今執行下TopicSender.java,就會看見這兩個消息驅動bean獲取到消息了。控制檯輸出:

  INFO [STDOUT] class cssage.ReceiveOtherBean您好,這是個人第一個topic消息
INFO [STDOUT] class cssage.ReceiveBean您好,這是個人第一個topic消息

    也就證實,對於發佈/訂閱傳遞模型,多個接收方均可以獲得這條消息

    回頭再測試下Queue類型的發送,運行QueueSender.java,對於queue類型的發送,它是一個消息只容許一個接收方進行接收。

  1021x426

 

原文:http://www.educity.cn/wenda/357315.html

相關文章
相關標籤/搜索