messagelistener 或 mdb 可以是有状态的吗?

Can a messagelistener or mdb be stateful?

与我关于 jca 入站事务管理的问题有关。

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

这可以通过将消息端点设置为@Stateful 来解决,但我不清楚是否允许这样做。

3.1 EJB 规范规定(第 5.1 节)

消息驱动 bean 实例没有会话状态。这意味着当所有 bean 实例不涉及为客户端消息提供服务时,它们都是等效的。

我从 TomiTribe(TomEE 背后的公司)的创始人 David Blevins 那里找到了一个 post,他说这是允许的。 https://github.com/dblevins/jca-quickstart/wiki/Inbound-Connectors-MDBs-Today

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

编辑: 请注意,JCA 规范指出(第 13.5 节)

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

所以,afaik 不能保证每次你通过代理时实际的监听器都是相同的。

让我回答我自己的问题。

规范中没有任何内容允许这样做。规范中引用的部分指出 mdb 不是有状态的。

但是,我与 David Blevins 取得了联系,他回答说: "Short answer is they are stateful for Wildfly and TomEE and for GlassFish, I can't quite remember."

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