从JavaEE发送的JMS消息,直到容器提交事务后才发送容器管理的事务

问题描述 投票:0回答:1

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

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

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

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

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

java-ee jms ejb stateless-session-bean
1个回答
0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.