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)