有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案