EJB3.0中的MessageDrivenBean

來源:互聯網
上載者:User

EJB3.0中MessageDrivenBean:

1.java訊息驅動bean屬於JavaMessage Service(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開發就成功了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.