EJB(三)细说message-driven bean

 

EJB(三)细说message-driven bean

2014-11-25 17:38 1690人阅读 评论(26) 收藏 举报
EJB(三)细说message-driven bean 分类:

目录(?)[+]

 

 

EJBMessage-driven bean基于JMS来实现的。在说明Message-driven bean之前需要来了解一下jms

 

JMS

Java-message-servicejava程序和企业级应用交互的一套规范,定义一组用于创建、发送、以及接受消息的API。发送者不需要知道接受者的任何内容,接受者也是同样。对于双方都是一种透明的方式来进行异步交互。J2ee1.3版本开始支持JMS,而JMS主要提供了一种标准的底层消息通信的规范。JMS有两种消息模型,p2p以及pop\sub模型。点对点主要通过消息队列的方式来消息传递,而发布订阅通过主题来实现订阅消息。

 

P2p

点对点的消息模型。发送者将消息发送到消息队列,接受者通过队列取得消息;适合单个接收者的消费者。类似于QQ的好友之间的即时通信。


结构


EJB(三)细说message-driven bean



Reciver


接受者从队列中接收消息,接受成功后应答结果


队列


消息发送到队列之后,会一直保留知道接受者接受成功该消息;

另外队列对于发送者和接受者来讲都是脱离工作的,接受者是否接受信息对于发送者发送消息到队列是没有影响的;

队列中的消息的是顺序存储的。


Sender


发送者发送消息到队列,消息将在队列中保存,直到被接收或者超时。


这样一个过程是异步处理的,接受者并不依赖发送者。发送者也不依赖与接受者。


 

pub\sub模型

 

类似于QQ的群聊,多个发布者将消息发送到指定主题,订阅者通过订阅该主题后能够接受到来自发布者的消息。主题负责将消息保存和分发。


结构



EJB(三)细说message-driven bean

 

 

两种模型的API


 

EJB(三)细说message-driven bean

 

 


和点对点模型不同的是,消息会使所有订阅者接收。并且只有当订阅者处于线上状态时才能接收到消息。

 

 

message-driven bean

 

JMS也是属于J2EE的规范之一。所以如果要支持JMS,就需要来按照jms定义jms中的一系列概念。

上面讲了JMS中的两种模型,EJB中的MDB就是这样一个异步的监听消息服务。

 

模型

EJB(三)细说message-driven bean

 

 

JMSj2ee的规范之一,定义了一些规范,如果要支持JMS就需要定义这样一系列的概念。如图所示连接工厂,会话等。

 

Connection factory


这个很好来理解,类似jdbc的数据源创建工厂;在创建数据源时需要一个创建工厂,这里也是同样的道理。需要一个连接创建工厂用来创建来创建呢?通过jndi查找来获得。JMSAPI定义两种连接工厂创建对象,分别是QueueConnectionFactory TopicConnectionFactory对应着p2pp\sub两种消息传递模式。


connection


通过connectionfactory就可以创建connectionconnection是什么,具体也不太清楚,是对TCP\IP协议的一个简单包装。对应的也有两种QueueConnectionTopicConnection。


session


用来生产消息的生产者、消息消费者、消息;还有对于这些消息的事务封装。

QueenSession TopicSession


messageProjducer


消息的生产者。由session创建,通过send\publish来发送消息到Destination


MessageConsumer


消息消费者。由session创建,通过receive\OnMessage来获取消息。


 

sessionbean的区别

 

无论是有状态的消息bean还是无状态的消息bean。在客户端调用服务器的bean时,都需要在客户端来引用服务器的接口。而MDB就不存在这个依赖的关系,唔需要关系接口。但是在某种程度上也算是需要一些依赖,比如说在服务器上mdb发送的一个是user对象,在客户端也需要针对这个消息进行user对象的处理。但是不存在接口之间的依赖。

 

第一个MDB

 

代码

 MDB

[java] view plain copy
 print?EJB(三)细说message-driven beanEJB(三)细说message-driven bean
  1. <span style="font-family:FangSong_GB2312;">package com.cfl.ejb;  
  2.   
  3. import javax.ejb.ActivationConfigProperty;  
  4. import javax.ejb.MessageDriven;  
  5. import javax.jms.JMSException;  
  6. import javax.jms.Message;  
  7. import javax.jms.MessageListener;  
  8. import javax.jms.TextMessage;  
  9.   
  10. @MessageDriven(activationConfig = {    
  11.         @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),    
  12.         @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/myqueue")}  
  13. )    
  14. public class MyQueueBean implements MessageListener {  
  15.   
  16.     @Override  
  17.     public void onMessage(Message arg0) {  
  18.         // TODO Auto-generated method stub  
  19.         TextMessage textMessage=(TextMessage)arg0;  
  20.         try {  
  21.             System.out.print("TextMessage="+textMessage.getText());  
  22.         } catch (JMSException e) {  
  23.             // TODO Auto-generated catch block  
  24.             e.printStackTrace();  
  25.         }  
  26.     }  
  27.   
  28. }  
  29. </span>  

client


[java] view plain copy
 print?EJB(三)细说message-driven beanEJB(三)细说message-driven bean
  1. <span style="font-family:FangSong_GB2312;">package com.cfl.ejbclient;  
  2.   
  3. import javax.jms.Queue;  
  4. import javax.jms.QueueConnection;  
  5. import javax.jms.QueueConnectionFactory;  
  6. import javax.jms.QueueSender;  
  7. import javax.jms.QueueSession;  
  8. import javax.jms.TextMessage;  
  9. import javax.naming.InitialContext;  
  10.   
  11.   
  12. public class MyQueueClient {  
  13.     public static void main(String args[])throws Exception{  
  14.           
  15.         //  
  16.         InitialContext context=new InitialContext();      
  17.         //創建connectionfactory對象   
  18.         QueueConnectionFactory acf=(QueueConnectionFactory)context.lookup("ConnectionFactory");  
  19.         //創建connection  
  20.         QueueConnection connection =(QueueConnection) acf.createConnection();  
  21.         //创建session  
  22.         QueueSession qs=(QueueSession) connection.createSession(false, QueueSession.AUTO_ACKNOWLEDGE);  
  23.         //创建destination  
  24.         Queue queue=(Queue) context.lookup("queue/myqueue");  
  25.         //创建消息  
  26.         TextMessage text=qs.createTextMessage("helloworld");  
  27.         //创建发送者  
  28.         QueueSender sender=qs.createSender(queue);  
  29.         //发送消息  
  30.         sender.send(text);  
  31.         //关闭会话  
  32.         qs.close();  
  33.         connection.close();  
  34.           
  35.         System.out.print("message is done");  
  36.           
  37.     }  
  38. }  
  39. </span>  


总结


应该是MDBJMS规范的一种实现方式,通过规范定义的API来书写这个流程即可。大致有这样几个步骤。


1)得到ConnectionFactory对象;

2)用ConnectionFactory创建Connection 对象;

4)用Connection对象创建一个或多个JMS Session;

5)JNDI创建destination

6)创建消息发送者、消息

 

 

0
0

我的同类文章

参考知识库

EJB(三)细说message-driven bean

Java SE知识库

EJB(三)细说message-driven bean

Java EE知识库

EJB(三)细说message-driven bean

Java 知识库

猜你在找
EJB核心课程,免费学 https在云服务器请求的启用 EasyDarwin开源流媒体服务器:编译、配置、部署 全网服务器数据备份解决方案案例实践 RedHat服务器的安装与部署
CS Model Based Message Driven应用系统开发 EJB系列三--有状态会话Bean和无状态会话Bean symbol lookup error usrlib64libwebkit-10so2 undefined symbol soup_message_set_first_party EJB消息驱动Bean 3EJB30 开发具有本地接口的----无状态bean
查看评论
14楼 黎明的蜗牛 2015-05-07 23:19发表 [回复]
EJB(三)细说message-driven bean
message-driven bean的详细讲解,学习了。
13楼 李贺刚 2014-12-31 14:52发表 [回复]
EJB(三)细说message-driven bean
讲解的很深入,学习了。
Re: CraftsmanChen 2014-12-31 22:24发表 [回复]
EJB(三)细说message-driven bean
回复a137151062:互相学习
12楼 9_张晓 2014-12-31 14:12发表 [回复]
EJB(三)细说message-driven bean
EJB的Message-driven bean基于JMS来实现的
Re: CraftsmanChen 2014-12-31 22:25发表 [回复]
EJB(三)细说message-driven bean
回复ggibenben1314:互相学习
11楼 ZeroWM 2014-12-30 13:31发表 [回复]
EJB(三)细说message-driven bean
博客看起来很舒服。
Re: CraftsmanChen 2014-12-31 22:25发表 [回复]
EJB(三)细说message-driven bean
回复successA:互相学习
10楼 chestnut_lan 2014-12-30 08:50发表 [回复]
EJB(三)细说message-driven bean
message-driven bean的详细讲解
Re: CraftsmanChen 2014-12-31 22:24发表 [回复]
EJB(三)细说message-driven bean
回复lantingxv_jing:互相学习
9楼 徐志鹏 2014-12-29 22:03发表 [回复]
EJB(三)细说message-driven bean
先来学习学习
Re: CraftsmanChen 2014-12-31 22:24发表 [回复]
EJB(三)细说message-driven bean
回复u010158267:互相学习
8楼 李社河 2014-12-05 20:06发表 [回复]
EJB(三)细说message-driven bean
EJB的Message-driven bean基于JMS来实现的
Re: CraftsmanChen 2014-12-31 22:25发表 [回复]
EJB(三)细说message-driven bean
回复lishehe:互相学习
7楼 贤子 2014-12-05 18:46发表 [回复]
EJB(三)细说message-driven bean
消息驱动bean,介绍的很好
Re: CraftsmanChen 2014-12-31 22:25发表 [回复]
EJB(三)细说message-driven bean
回复kanglix1an:互相学习
6楼 陈丽娜 2014-12-05 13:53发表 [回复]
EJB(三)细说message-driven bean
很详细的介绍呀!
Re: CraftsmanChen 2014-12-31 22:25发表 [回复]
EJB(三)细说message-driven bean
回复jly4758:还是得实践啊
5楼 谷海燕 2014-12-04 17:18发表 [回复]
EJB(三)细说message-driven bean
都研究到这儿啦.
Re: CraftsmanChen 2014-12-31 22:26发表 [回复]
EJB(三)细说message-driven bean
回复zhuanzhe117:初步学习
4楼 fightingKing 2014-12-02 13:49发表 [回复]
EJB(三)细说message-driven bean
讲解的很深入,学习了。
3楼 zllaptx4869 2014-11-30 21:31发表 [回复]
EJB(三)细说message-driven bean
回调注解在消息驱动bean挺有意思的一个
Re: CraftsmanChen 2014-12-31 22:26发表 [回复]
EJB(三)细说message-driven bean
回复zllaptx4869:是的
2楼 ironxue 2014-11-29 16:00发表 [回复]
EJB(三)细说message-driven bean
图文并茂,介绍得很清晰,顶楼主。
1楼 于亮 2014-11-27 20:54发表 [回复]
EJB(三)细说message-driven bean
介绍的相当有水平
Re: CraftsmanChen 2014-12-31 22:26发表 [回复]
EJB(三)细说message-driven bean
回复jiuqiyuliang:互相学习