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)