欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【EJB】消息驱动Bean(MDB)

程序员文章站 2024-02-22 23:01:22
...

前言

     消息驱动bean(MDB)是允许Java EE应用程序异步处理消息的企业bean。MDB可以实现任何类型的消息。最常用的处理Java消息服务(JMS)消息。这些Bean是无状态的,当JMS消息到达目的地时由容器调用。会话Bean可以同步接收JMS消息,但消息驱动Bean可以异步接收消息。

叙述

是什么

   消息驱动bean是允许Java EE应用程序异步处理消息的企业bean。这种类型的bean通常充当JMS消息侦听器,与事件侦听器类似,但接收JMS消息而不是事件。消息可以由任何Java EE组件(应用程序客户端,另一个企业bean或Web组件)或由不使用Java EE技术的JMS应用程序或系统发送。消息驱动的bean可以处理JMS消息或其他类型的消息。

何时使用消息驱动的Bean

   会话bean允许您发送JMS消息并同步接收它们,但不是异步的。为了避免捆绑服务器资源,请不要在服务器端组件中使用阻塞同步接收; 一般来说,不应该同步发送或接收JMS消息。要异步接收消息,请使用消息驱动的bean。

代码实现

可以使用@MessageDriven将一个POJO转换为消息驱动Bean.

@MessageDriven(mappedName ="myDestination")
public class MyMessageBean implements MessageListener{
    @Override
    public void onMessage(Message message){
	try{
	   //process the message
        }
	catch(JMSException ex){
	   //...
        }
    }

}
  在这段代码中,@MessageDriven定义Bean为消息驱动Bean。mappedName属性指定JMS目的地,即消费该消息的Bean的JNDI名称。Bean必须实现MessageListener接口,它只提供了一个方法onMessage.每当消息驱动Bean接收到的消息包含应用程序特定的业务逻辑时,容器会调用该方法。

消息驱动Bean VS 会话Bean

  消息驱动的bean和会话bean之间最明显的区别是客户端不通过接口访问消息驱动的bean。与会话bean不同,消息驱动的bean只有一个bean类。

相同点:

在几个方面,消息驱动bean类似于无状态会话bean。
(1)消息驱动bean的实例不保留特定客户端的数据或对话状态。
(2)消息驱动bean的所有实例都是等价的,从而允许EJB容器将消息分配给任何消息驱动的bean实例。容器可以共享这些实例,以允许同时处理消息流。
(3)一个消息驱动的bean可以处理来自多个客户端的消息。

不同点:

消息驱动bean实例的实例变量可以包含处理客户端消息的一些状态,例如JMS API连接,打开的数据库连接或对企业bean对象的对象引用。
客户端组件不会定位消息驱动的bean,并直接在其上调用方法。相反,客户端通过发送消息到消息驱动bean类所在的消息目标,通过例如JMS访问消息驱动bean MessageListener。您在部署期间使用GlassFish服务器资源分配消息驱动的bean的目标。

消息驱动bean具有以下特征。
(1)它们在收到单个客户端消息时执行。
(2)它们是异步调用的。
(3)他们是相对短暂的。
(4)它们并不直接代表数据库中的共享数据,但可以访问和更新这些数据。
(5)他们可以交易意识。
(6)他们是无国籍的。
当消息到达时,容器调用消息驱动bean的 onMessage方法来处理消息。该onMessage方法通常将消息转换为五个JMS消息类型之一,并根据应用程序的业务逻辑进行处理。该 onMessage方法可以调用helper方法,也可以调用会话bean来处理消息中的信息或将其存储在数据库中。
消息可以传递给事务上下文中的消息驱动bean,因此onMessage方法中的所有操作都是单个事务的一部分。如果消息处理回滚,消息将被重新发送。

小结

    单一的消息驱动Bean可以同时处理来自多个客户端的消息。就像无状态会话Bean,容器可以使用实例池,并分配足够的Bean实例来处理给定时间内一定数量的消息。Bean的所有实例都被一视同仁。