我有一个JavaEE应用程序,该应用程序使用REST API初始化长时间运行的事务(请求返回202 Accepted。
我正在使用JMS将进度消息发送到已启动这些过程的客户端。但是,直到长时间运行的过程终止,才发送任何消息。我相信这是因为JMS正在等待提交,并且(默认情况下)容器将不会发出一个通知,直到进程结束。
大多数EJB是@Stateless
,包括运行时间长的进程和发送消息的EJB。
我通过在发送JMS消息的方法上添加@TransactionAttribute(REQUIRES_NEW)
来“解决”此问题。我尝试将REQUIRES_NEW
添加到长时间运行的任务代码中的选定方法中,但这似乎不起作用。
[我担心大量的提交会对性能产生不利影响。有更好的方法吗?
我将确认,在进行任何其他更改之前,额外的提交实际上会对统计性能产生负面影响。您的担心可能放错了地方。正如尊贵的唐纳德·克努斯(Donald Knuth)所说:“过早的优化是万恶之源。”
[如果发现额外提交的性能开销太大,则可以尝试在发送JMS消息的方法或calls发送JMS消息的方法上使用@TransactionAttribute(NOT_SUPPORTED)
。] >
请记住,长时间运行的事务通常被认为是一种反模式,因此,除非为确保数据完整性绝对必要,否则您可能希望完全放弃它们(鉴于REST API很少,如果有的话,情况似乎并非如此) ,交易)。