EJB MDB(消息驱动bean)

1、Queue:

客户端:

  1. public class MyMDBBeanClient {
  2. public static void main(String[] args) throws Exception {
  3. InitialContext ict = new InitialContext();
  4. //获取connectionFactory对象
  5. QueueConnectionFactory factory = (QueueConnectionFactory)ict.lookup("ConnectionFactory");
  6. //获取Connection对象
  7. QueueConnection connection = factory.createQueueConnection();
  8. //获取Session对象,第一个参数表示事务自动提交,第二个参数表示一旦消息被正确发送,将自动发回响应
  9. QueueSession session = connection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
  10. //获取destination对象
  11. Queue queue = (Queue)ict.lookup("queue/myqueue");
  12. //设置消息
  13. TextMessage msg = session.createTextMessage("hello world ");
  14. //获取sender对象
  15. QueueSender sender = session.createSender(queue);
  16. //发送消息
  17. sender.send(msg);
  18. session.close();
  19. System.out.println("消息已经发送!");
  20. }
  21. }

MDB:

  1. public class MyMDBBeanClient {
  2. public static void main(String[] args) throws Exception {
  3. InitialContext ict = new InitialContext();
  4. //获取connectionFactory对象
  5. QueueConnectionFactory factory = (QueueConnectionFactory)ict.lookup("ConnectionFactory");
  6. //获取Connection对象
  7. QueueConnection connection = factory.createQueueConnection();
  8. //获取Session对象,第一个参数表示事务自动提交,第二个参数表示一旦消息被正确发送,将自动发回响应
  9. QueueSession session = connection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
  10. //获取destination对象
  11. Queue queue = (Queue)ict.lookup("queue/myqueue");
  12. //设置消息
  13. TextMessage msg = session.createTextMessage("hello world ");
  14. //获取sender对象
  15. QueueSender sender = session.createSender(queue);
  16. //发送消息
  17. sender.send(msg);
  18. session.close();
  19. System.out.println("消息已经发送!");
  20. }
  21. }

2.Topic

客户端:

  1. public class MyTopicMDBBeanClient {
  2. public static void main(String[] args) throws Exception {
  3. InitialContext ict = new InitialContext();
  4. //获取connectionFactory对象
  5. TopicConnectionFactory factory = (TopicConnectionFactory)ict.lookup("ConnectionFactory");
  6. //获取Connection对象
  7. TopicConnection connection = factory.createTopicConnection();
  8. //获取Session对象,第一个参数表示事务自动提交,第二个参数表示一旦消息被正确发送,将自动发回响应
  9. TopicSession session = connection.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE);
  10. //获取destination对象
  11. Topic topic = (Topic)ict.lookup("topic/mytopic");
  12. //设置消息
  13. TextMessage msg = session.createTextMessage("hello world ");
  14. //获取sender对象
  15. TopicPublisher publisher = session.createPublisher(topic);
  16. //发送消息
  17. publisher.publish(msg);
  18. session.close();
  19. System.out.println("消息已经发送!");
  20. }
  21. }

MDB1:

  1. @MessageDriven (
  2. activationConfig = {
  3. @ActivationConfigProperty(propertyName="destinationType",propertyValue="javax.jms.Topic"),
  4. @ActivationConfigProperty(propertyName="destination",propertyValue="topic/mytopic")
  5. }
  6. )
  7. public class MyTopicMDBBean1 implements MessageListener {
  8. public void onMessage(Message msg) {
  9. TextMessage message = (TextMessage)msg;
  10. try {
  11. System.out.println("MyTopicMDBBean1调用了:"+ message.getText());
  12. } catch (JMSException e) {
  13. e.printStackTrace();
  14. }
  15. }
  16. }

MDB2:

  1. @MessageDriven (
  2. activationConfig = {
  3. @ActivationConfigProperty(propertyName="destinationType",propertyValue="javax.jms.Topic"),
  4. @ActivationConfigProperty(propertyName="destination",propertyValue="topic/mytopic")
  5. }
  6. )
  7. public class MyTopicMDBBean2 implements MessageListener {
  8. public void onMessage(Message msg) {
  9. TextMessage message = (TextMessage)msg;
  10. try {
  11. System.out.println("MyTopicMDBBean2调用了:"+ message.getText());
  12. } catch (JMSException e) {
  13. e.printStackTrace();
  14. }
  15. }
  16. }

3、部署运行测试

将ejb mdb(queue、toppic)部署到jboss服务器上,运行客户端。

注意:如果是部署到jboss4.0版本上,不会有问题,但直接部署到jboss5.0版本上会报错:javax.naming.NameNotFoundException:myqueue not bound

原因:这个意思是说标识的destination的JNDI没有找到因此需要写一个配置文件来标识我的mdb的jndi起名为mymdb-service.xml并放于deploy目录下(解决方法2)

解决方法1:

在JBoss根目录\server\default\deploy 下的mail-service.xml(或其他类似)文件中加入如下:

<mbeancode="org.jboss.mq.server.jmx.Queue"name="jboss.org.destination:server=Queue,name=myqueue" >

  <attributename="JNDIName" >queue/myqueue</attribute>

  <dependsoptional-attribute-name = "DestinationManager" >jboss.mq:service=DestinationManager </depends>

</mbean>

topic找不到

<mbean code="org.jboss.mq.server.jmx.Topic"name="jboss.org.destination:server=Topic,name=mytopic" >

<!-- JNDI名称 -->

<attributename="JNDIName">topic/mytopic</attribute>

<dependsoptional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>

</mbean>

解决方法2:

<?xml version="1.0" encoding="UTF-8"?>
<server>
<mbean code="org.jboss.mq.server.jmx.Queue"
name="jboss.mq.destination:service=Queue,name=myDestination">
<attribute name="JNDIName">queue/myqueue</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=myDestination">
<attribute name="JNDIName">topic/mytopic</attribute>
<depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
</mbean>
</server>

重启JBoss问题即解决。

当然,如果有其他的MDB,还需要继续加入JNDIName。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值