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

Jakarta ee 从JavaEE发送的带有容器管理事务的JMS消息在容器提交事务之前不会发送,jakarta-ee,jms,ejb,stateless-session-bean,Jakarta Ee,Jms,Ejb,Stateless Session Bean,我有一个JavaEE应用程序,它使用RESTAPI启动长时间运行的事务(请求返回202个已接受) 我正在使用JMS向启动这些流程的客户端发送进度消息。但是,在长时间运行的进程终止之前,不会发送任何消息。我认为这是因为JMS正在等待提交,并且(默认情况下)容器在流程结束之前不会发出提交 大多数EJB是无状态的,包括长时间运行的进程和发送消息的EJB 我通过在发送JMS消息的方法上添加@TransactionAttribute(REQUIRES\u NEW)来“解决”这个问题。我尝试在长时间运行的任

我有一个JavaEE应用程序,它使用RESTAPI启动长时间运行的事务(请求返回202个已接受)

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

大多数EJB是无状态的,包括长时间运行的进程和发送消息的EJB

我通过在发送JMS消息的方法上添加
@TransactionAttribute(REQUIRES\u NEW)
来“解决”这个问题。我尝试在长时间运行的任务代码中向选定的方法添加
REQUIRES\u NEW
,但似乎不起作用


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

在进行任何其他更改之前,我会确认额外的提交实际上会以统计上显著的方式对性能产生负面影响。你的担心可能放错地方了。正如德高望重的唐纳德·克努特(Donald Knuth)所言,“过早优化是万恶之源。”

如果您发现额外提交的性能开销太大,您可以尝试在发送JMS消息的方法或调用发送JMS消息的方法的方法上使用
@TransactionAttribute(不受支持)


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

我确认@Justin Bertram建议在发送JMS消息的方法上使用
@TransactionAttribute(不受支持)
,我认为这样更有效(我目前没有积极使用事务)。将此答案标记为正确。