【问题标题】:Can a messagelistener or mdb be stateful?messagelistener 或 mdb 可以是有状态的吗?
【发布时间】:2026-01-13 00:00:01
【问题描述】:

与我关于 jca 入站事务管理的问题有关。 How to control XAResource in inbound jca resource adapter for conversational transaction?

对于入站资源适配器,我需要保持事务打开并在该事务中执行不同的操作。

这可以通过使消息端点@Stateful 来解决,但我不清楚这是否允许。

3.1 EJB 规范声明(第 5.1 节)

消息驱动的 bean 实例没有会话状态。这意味着所有 bean 实例在不参与服务客户端消息时都是等效的。

我发现 TomiTribe(TomEE 之后的公司)的创始人 David Blevins 发的帖子说这是允许的。 https://github.com/dblevins/jca-quickstart/wiki/Inbound-Connectors-MDBs-Today

另一种方法是尝试自己管理 XAResrouce,但还没有运气......

编辑: 请注意,JCA 规范声明(第 13.5 节)

请注意,由 createEndPoint 方法调用提供的端点实例是 实现端点消息侦听器类型的代理和 MessageEndpoint 接口,它不是实际的端点。

因此,afaik 无法保证每次通过代理时实际的侦听器都是相同的。

【问题讨论】:

    标签: ejb message-driven-bean jca stateful


    【解决方案1】:

    让我回答我自己的问题。

    规范中没有任何内容允许这样做。规范中提到的部分声明 mdb 是无状态的。

    但是,我与 David Blevins 取得了联系,他回答说: “简短的回答是它们对于 Wildfly 和 TomEE 以及对于 GlassFish 是有状态的,我不太记得了。”

    因此它可能适用于您的平台,但不要期望该行为可以跨服务器甚至是同一应用程序服务器的不同版本移植。

    【讨论】: