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(); } } }
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(); } } }
3)在JBoss6.0安装目录下(如:D:\jboss\server\default\deploy\hornetq)找到hornetq-jms.xml文件,并把如下内容添加到该配置文件中。
<topic name="MyTopic"> <entry name="/topic/mytopic"/> </topic> <queue name="MyQueue"> <entry name="/queue/myqueue"/> </queue>
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("消息已发送!"); } }
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("消息已发送!"); } }
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被调用=====收到主题: 你好,这是一个主题消息!