从JavaEE发送的具有容器托管事务的JMS消息只有在容器提交事务后才发送

我有一个JavaEE应用程序,该应用程序使用REST API初始化长时间运行的事务(请求返回202 accepted)。

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

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

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

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

exchange456 回答:从JavaEE发送的具有容器托管事务的JMS消息只有在容器提交事务后才发送

在进行任何其他更改之前,我将确认额外的提交实际上会对统计性能产生负面影响。您的担心可能放错了地方。正如尊贵的唐纳德·克努思(Donald Knuth)所说:“过早的优化是万恶之源。”

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

请记住,长时间运行的事务通常被认为是一种反模式,因此您可能希望完全抛弃它们,除非为确保数据完整性绝对必要(除非由于很少使用REST API,否则就不会出现这种情况)交易)。

本文链接:https://www.f2er.com/3000866.html

大家都在问