EJB3 中Message-Driven Bean的開發過程及其工作原理
JBoss6.0 + EJB3 中Message-Driven Bean 的"HelloWorld" 實現。
目的:了解 EJB3 中Message-Driven Bean的開發過程及其工作原理。
開發步驟:
1)開發服務端。編寫Message-Driven Bean類。
2)配置并發布Message-Driven Bean到JBoss服務器。
3)開發消息客戶端。
項目結構預覽:
1)服務端項目結構:
2)客戶端項目結構:
開發過程及詳細代碼:
1)DMBQueueBean
package com.ejb;import javax.ejb.ActivationConfigProperty; import javax.ejb.MessageDriven; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.TextMessage;
@MessageDriven( activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), @ActivationConfigProperty(propertyName="destination",propertyValue="queue/myqueue") }) public class MDBQueueBean implements MessageListener {
@Override public void onMessage(Message message) { try { TextMessage textMessage = (TextMessage)message; System.out.println("MDBQueueBean被調用=====收到消息: "+textMessage.getText()); } catch (JMSException e) { e.printStackTrace(); } }
}</pre>
2)DMBTopicBean
package com.ejb;import javax.ejb.ActivationConfigProperty; import javax.ejb.MessageDriven; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.TextMessage;
@MessageDriven( activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"), @ActivationConfigProperty(propertyName="destination",propertyValue="topic/mytopic") }) public class DMBTopicBean implements MessageListener {
@Override public void onMessage(Message message) { try { TextMessage textMessage = (TextMessage)message; System.out.println("MDBTopicBean被調用=====收到主題: "+textMessage.getText()); } catch (JMSException e) { e.printStackTrace(); } }
}</pre>
3)在JBoss6.0安裝目錄下(如:D:\jboss\server\default\deploy\hornetq)找到hornetq-jms.xml文件,并把如下內容添加到該配置文件中。
4)DMBQueueBeanTest
package com.ejb.messagedriven;import javax.jms.Queue; import javax.jms.QueueConnection; import javax.jms.QueueConnectionFactory; import javax.jms.QueueSender; import javax.jms.QueueSession; import javax.jms.TextMessage; import javax.naming.InitialContext;
public class DMBQueueBeanTest {
public static void main(String[] args) throws Exception { InitialContext ctx = new InitialContext(); // 獲取ConnectionFactory對象 QueueConnectionFactory factory = (QueueConnectionFactory) ctx .lookup("ConnectionFactory"); // 創建QueueConnection對象 QueueConnection connection = factory.createQueueConnection(); // 創建QueueSession對象,第一個參數表示事務自動提交,第二個參數標識一旦消息被正確送達,將自動發回響應 QueueSession session = connection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE); // 獲得Destination對象 Queue queue = (Queue) ctx.lookup("queue/myqueue"); // 創建文本消息 TextMessage msg = session.createTextMessage("你好,這是一個隊列消息! "); // 創建發送者 QueueSender sender = session.createSender(queue); // 發送消息 sender.send(msg); // 關閉會話 session.close(); connection.close(); System.out.println("消息已發送!"); }
}</pre>
5)DMBTopicBeanTest
package com.ejb.messagedriven;import javax.jms.TextMessage; import javax.jms.Topic; import javax.jms.TopicConnection; import javax.jms.TopicConnectionFactory; import javax.jms.TopicPublisher; import javax.jms.TopicSession; import javax.naming.InitialContext;
public class DMBTopicBeanTest {
public static void main(String[] args) throws Exception { InitialContext ctx = new InitialContext(); // 獲取ConnectionFactory對象 TopicConnectionFactory factory = (TopicConnectionFactory) ctx .lookup("ConnectionFactory"); // 創建TopicConnection對象 TopicConnection connection = factory.createTopicConnection(); // 創建TopicSession對象,第一個參數表示事務自動提交,第二個參數標識一旦消息被正確送達,將自動發回響應 TopicSession session = connection.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE); // 獲得Destination對象 Topic topic = (Topic) ctx.lookup("topic/mytopic"); // 創建文本消息 TextMessage msg = session.createTextMessage("你好,這是一個主題消息! "); // 創建發布者 TopicPublisher publisher = session.createPublisher(topic); // 發送消息 publisher.publish(msg); // 關閉會話 session.close(); connection.close(); System.out.println("消息已發送!"); }
}</pre>
6)jndi.properties
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces java.naming.provider.url=localhost
7)測試:
1.測試DMBQueueBean
控制臺中客戶端輸出:
2012-10-30 18:56:03 INFO createSocket, hostAddr: localhost/127.0.0.1, port: 1099, localAddr: null, localPort: 0, timeout: 0 消息已發送!控制臺中服務端輸出:
18:55:50,487 INFO [org.jboss.ejb3.EJBContainer] STARTED EJB: com.ejb.MDBQueueBean ejbName: MDBQueueBean 18:55:50,487 WARN [org.jboss.ejb3.TimerServiceContainer] EJBTHREE-2193: using deprecated TimerServiceFactory for restoring timers 18:56:05,231 INFO [STDOUT] MDBQueueBean被調用=====收到消息: 你好,這是一個隊列消息!2.測試DMBTopicBean
控制臺中客戶端輸出:
2012-10-30 18:57:14 INFO createSocket, hostAddr: localhost/127.0.0.1, port: 1099, localAddr: null, localPort: 0, timeout: 0 消息已發送!控制臺中服務端輸出:
18:57:54,235 INFO [STDOUT] MDBTopicBean被調用=====收到主題: 你好,這是一個主題消息!