【发布时间】:2014-09-17 05:20:27
【问题描述】:
在 jms 中,我们有 MessageLister , onMesssage 接收消息。那为什么我们需要MessageDrivenBean?这已经过时了吗?在 javaee6 MDB api 中,他们说从 ejb 3.0 开始,它没有被使用。 mdb 和 jms 有什么区别?
什么是 Jms 中的同步调用?该响应是否立即返回给调用者? Jms中是否保证同步调用?
【问题讨论】:
在 jms 中,我们有 MessageLister , onMesssage 接收消息。那为什么我们需要MessageDrivenBean?这已经过时了吗?在 javaee6 MDB api 中,他们说从 ejb 3.0 开始,它没有被使用。 mdb 和 jms 有什么区别?
什么是 Jms 中的同步调用?该响应是否立即返回给调用者? Jms中是否保证同步调用?
【问题讨论】:
首先让我们消除一个误解: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 可以与其他消息传递技术一起使用,而 JMS 显然可以在 MDB 之外使用。在我看来,在 Java EE 应用程序中使用 MDB 的要点是易于实现可以感知事务的消息端点。
在同步消息系统系统中,发送端将等待消息被传递。然而,在异步系统中,发送者无需等待实际交付就立即返回。这会导致系统两端之间的耦合更加松散,并且您的发送端由于接收器故障或过载而锁定/减速的风险为零。
【讨论】: