从 JavaEE 发送的带有容器管理事务的 JMS 消息在容器提交事务之前不会发送

JMS messages sent from JavaEE with container managed transactions not sent until container commits the transaction

我有一个使用 REST API 启动长 运行 事务的 JavaEE 应用程序(请求 return 202 已接受)。

我正在使用 JMS 向启动这些进程的客户端发送进度消息。但是,在长 运行 进程终止之前,不会发送任何消息。我相信这是因为 JMS 正在等待提交并且(​​默认情况下)容器在进程结束之前不会提交。

大多数 EJB 是 @Stateless,包括长 运行 进程和发送消息的 EJB。

我 "solved" 通过在发送 JMS 消息的方法上添加 @TransactionAttribute(REQUIRES_NEW) 来做到这一点。我尝试将 REQUIRES_NEW 添加到长 运行 任务代码中的选定方法,但这似乎不起作用。

我担心大量提交会对性能产生不利影响。有没有更好的方法?

在进行任何其他更改之前,我会确认额外的提交实际上以统计上显着的方式对性能产生了不利影响。你的担心可能是错误的。正如可敬的 Donald Knuth 所说,"Premature optimization is the root of all evil."

如果您发现额外提交的性能开销太大,您可以尝试在发送 JMS 消息的方法或 调用[=18 的方法上使用 @TransactionAttribute(NOT_SUPPORTED) =] 发送 JMS 消息的方法。

请记住,long-运行 事务通常被认为是一种反模式,因此您可能希望完全放弃它们,除非对数据完整性绝对必要(考虑到情况似乎并非如此) REST API 很少(如果有的话)是事务性的)。