【EJB】消息驱动Bean(MDB)

前言

     消息驱动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的所有实例都被一视同仁。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hi-Sunshine

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值