是不是从ejb3.0使用MessageDrivenBean?

时间:2014-09-16 20:30:02

标签: jms message-driven-bean

在jms中,我们有MessageLister,onMesssage接收消息。那为什么我们需要MessageDrivenBean?这已经过时了吗?在javaee6 MDB api中,他们说从ejb 3.0开始,它没有被使用。 mdb和jms有什么区别?

什么是Jms中的同步调用?是响应立即返回给调用者? Jms中是否保证同步调用?

1 个答案:

答案 0 :(得分:1)

首先让我们对休息产生误解:EE6 Javadoc for the MessageDrivenBean interface

  

从EJB 3.0开始,不再需要消息驱动的bean类 实现此接口

这是因为从EJB 3.0开始,您通常会使用@MessageDriven注释来声明MDB,并使用@Resource注释来获取其MDC。像这样,from the official tutorial

@MessageDriven(activationConfig = {
    @ActivationConfigProperty(propertyName = "destinationLookup",
            propertyValue = "jms/MyQueue"),
    @ActivationConfigProperty(propertyName = "destinationType",
            propertyValue = "javax.jms.Queue")
})
public class SimpleMessageBean implements MessageListener {

    @Resource
    private MessageDrivenContext mdc;
    static final Logger logger = Logger.getLogger("SimpleMessageBean");

虽然经常一起使用,但MDB和JMS完全不同:

  • MDB是异步消息接收器的编程模型,它非常适合JavaEE编程环境,并且与其他EJB类型(如事务感知)共享重要属性。
  • JMS是一种消息传递技术规范,即面向消息的中间件的蓝图。

MDB可以与其他消息传递技术一起使用,显然JMS可以在MDB之外使用。在我看来,在Java EE应用程序中使用MDB的要点是易于实现可以识别事务的消息端点。

在同步消息传递系统系统中,发送端将等待传递消息。但是,在异步系统中,发送方立即返回,而不等待实际发送。这导致系统两端之间的耦合更加松散,并且由于接收器故障或过载而导致发送方锁定/减速的风险为零。