`
kylinsoong
  • 浏览: 236191 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

EJB7: Message Driven Bean

阅读更多

在企业系统中需要使用消息传递,在企业系统中使用消息传递需要满足下面几个条件:

1 调用必须是支持异步的;

2 调用必须是可靠的;

3 调用可以支持有多个调用者和多个接受;

为什么消息传递在企业调运中能够满足上面三点要求?如下图:

 消息中间件,它类似于一个在发送者和接收者的中间缓存机制,发送调用请求和接收可以异步的工作,发送方发完消息就可以继续忙着执行自己的程序,并且不必等待消息的接受者完成消息所规定的任务,消息缓存在消息中间件中,接收方从消息中间中一个一个的取走消息,按部就班的一个个执行。

Java 消息服务(JMS)

      JMS 提供了统一的消息传递机制,以一种标准化的形式与底层的消息服务提供者交互,JMS 提供抽象的实现以统一的方式访问消息传递系统。依赖于JMS 的帮助,消息传递客户机在各个厂商的消息传递产品之间进行移植。

      JMS 共包含两方面的内容:JMS API 用于开发发送和接收消息的两端的应用程序,SPI(Service Provider Interface),服务提供者接口,用于集成各个厂商的消息中间件。

      JMS 提供了两种类型的消息传递模型:发布与订阅(publish-and-subscribe,pub/sub)以及点到点(point-to-point,p2p)。

发布与订阅(pub/sub)模型,如下图:



      pub/sub 目的是用于一对多或多对多的消息广播

      在pub/sub 模型中,一个消息传递客户机,也就是消息的生产者机,即发布消息的程序通过被称为Topic(主题)的虚拟信道将消息发送到多个订阅此主题的消息传递客户机,也就是消息的消费者,即订阅消息的程序

      pub/sub 模型可支持持久订阅(Durable Subscription),也就是订阅Topic的消息接收端从JMS 服务器上断开时,消息服务器有责任存储订阅程序丢失的消息;

点到点(p2p)模型,如下图:



      p2p 目的是用于一对一的消息通信;

      p2p 模型让消息传递客户机通过称为Queue(队列)的虚拟信道发送和接收消息;

      在p2p 模型中的消息由一位并且只能由一位接收方消费一次,也就是每个消息仅存在一个消费者;

      队列中的消息在缺省情况下是持久的;

JMS API (接收和发送消息)

用JMS API 发送或者接收一个消息需要以下几个步,如下图:



      1.定位JMS提供者:消息的客户端(发送者和接收者)首先需要访问消息中间件的具体提供者,需要使用ConnectionFactory实例来建立连接。用JNDI查找定位到ConnectionFactory的实例。

      2. 创建JMS连接:定位之后,开始创建连接。

      3.创建JMS Session:用JMS连接创建JMS Session对象, JMS Session对象可以用来创建JMS消息。

      4.定位JMS目的地: JMS目的地指向消息发送的通道,借助JNDI,我们能定位到JMS目的地。

      5.创建JMS生产者和消费者:如果需要发送消息,需要借助某个JMS的对象传递消息,这中JMS对象叫做JMS生产者,如果需要接收消息,需要借助某个JMS的对象叫做JMS消费者。我们用JMS Session创建JMS生产者和消费者。

      6.创建JMS消息:我们用JMS Session创建JMS消息。

      7.接收和发送消息:创建了JMS消息之后,最后我们用JMS生产者和消费者接收和发送消息。

API应用实例:(一个 p2p 发送消息实例)

  Step 1:初始化JNDI Tree 找到存储JNDI 的服务器,用JNDI lookup ConnectionFactory

Properties props = new Properties();
props.setProperty(Context.INITIAL_CONTEXT_FACTORY , "org.jnp.interfaces.NamingContextFactory");
props.setProperty(Context.PROVIDER_URL, "localhost:1099");
props.setProperty(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
Context ctx = new InitialContext(props);
QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("QueueConnectionFactory");

 Step 2: 创建JMS连接

QueueConnection conn = factory.createQueueConnection();

 Step 3 :.创建JMS Session

QueueSession session = conn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);

 Step 4: 定位JMS目的地

Destination destination = (Destination) ctx.lookup("queue/kylindmb");

 Step 5:创建JMS生产者或消费者

MessageProducer producer = session.createProducer(destination);

Step 6:创建JMS消息

TextMessage msg = session.createTextMessage("Kylin Sonng First test Message Driver Bean");

Step 7:接收或发送消息

producer.send(msg);

 注意:以上JMS提供者是JBoss 4.3;发送或接收完消息要关闭session和connection

JMS 支持一下消息类型,这些消息类型都派生自Message 接口

      StreamMessage:消息包含Java 基本数值流,用标准流操作来顺序的填充和读取。

      MapMessage:消息包含一组名/值对;名称为string 类型,而值为Java 的基本类型。

      TextMessage:消息包含一个String。

      ObjectMessage:消息包含一个Serializable(可序列化)的Java对象;能使用JDK 的集合类。

      BytesMessage:消息包含未解释字节流,编码主体以匹配现存的消息格式。

      XMLMessage:消息包含XML内容。扩展TextMessage,类型的消息,XMLMessage 类型的使用,使得消息过滤非常便利。

消息驱动Bean MDB(Message Driven Bean )

      消息驱动Bean简单的说他就是一个能接收或能消费消息的接收者或消费者,所不同的是MDB是在EJB容器中消费和处理异步JMS 消息,这样可以把一些任务抽象出来交给容器中提供的基础功能去完成。

      有了MDB,我们可以形象的描绘出这样的场景:客户端借助JMS API发送消息,然后接收到该消息的MDB被这个消息所驱动,开始运行,处理这个消息,这个过程好像我们按下了一个按钮,按钮后面的事件程序就开始运行,如下图:



 一个MDBean实例

http://kylinsoong.iteye.com/blog/851678

  • 大小: 3.9 KB
  • 大小: 7.5 KB
  • 大小: 5.9 KB
  • 大小: 21.7 KB
  • 大小: 5.1 KB
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics