java@TransactionalEventListener(fallbackExecution=true)在提交之前运行
我有一个@Service
类,它在Spring @Transactional
方法中运行一些逻辑
该方法通过将isCompleted标志设置为true来“完成”流程
然后更新数据库中的进程,并启动ProcessCompletedEvent
用@TransactionalEventListener(fallbackExecution = true)
注释的异步ProcessCompletedEventListener将拾取已启动的ProcessCompletedEvent,如果已完成的进程数等于一,则执行一些额外的逻辑
以下是一些示例代码:
@Service
public class ProcessService {
@Override
@Transactional
public Process completeProcess(Process process) throws ServiceException {
process.setCompleted(true);
process = processDao.update(process);
eventPublisher.publishEvent(new ProcessCompletedEvent(process));
return process;
}
}
@Component
public class ProcessCompletedListener {
@TransactionalEventListener(fallbackExecution = true)
public void doStuffWhenFirstProcess(ProcessCompletedEvent event) {
Process process = event.getProcess();
//Thread.sleep(1000) <- Uncomment this, and everything works
if (processService.getNumberOfCompletedProcesses(process.getUser()) == 1) {
doStuff();
}
}
在我的单元测试中,我与一个没有完成流程的新用户一起运行该测试。理论上,当用这个用户调用completeProcess()
时,侦听器应该调用doStuff()
,因为这个用户现在只有一个已完成的进程
问题是,当没有事务(completeProcess()已完成且已关闭的事务)时,一切正常。但是,当存在事务时,processService.getNumberOfCompletedProcesses(process.getUser())
返回0
。这可能是因为将流程更新为已完成的事务尚未提交
然而,由于默认阶段是在_COMMIT之后,情况不应该是这样。侦听器应该等到事务提交后再运行。在这种情况下,测试应始终通过
值得一提的是,我使用SimpleApplicationEventMulticaster
进行异步事件处理。对于在新线程中生成的事件侦听器来说,这一切都如期工作
我已经用尽了所有的可能性,我非常担心它们是Spring@TransactionalEventListener中的一个缺陷。在我向Spring提交错误报告之前,我想我会给你们一个机会指出一些问题。非常感谢
共 (0) 个答案