事务回滚后从文件系统中删除文件

时间:2018-10-15 08:29:41

标签: java spring event-handling spring-transactions

在Spring应用程序中采用事务方法时,数据应保留,并将文件写入文件系统(带有路径和文件名)。现在,如果由于某种原因数据库事务失败,则应再次从文件系统中删除该文件。

为此,我正在考虑使用事件侦听器,如下所示。

@TransactionalEventListener(phase = TransactionPhase.AFTER_ROLLBACK)
public void handleRollback() {
    // remove file with the use of the path and file name 
    // (but where do those two parameters come from?)
}

但是,在该事件侦听器中,我需要路径的属性valuefileName才能知道要删除哪个文件。但我认为导致回滚的事件将由Spring触发,并且我无法将值与之一起传递。

那我该如何处理回滚?

2 个答案:

答案 0 :(得分:1)

您可以尝试以下架构:

var values = Bp.GetType()
    .GetProperties(BindingFlags.DeclaredOnly |
        BindingFlags.Public |
        BindingFlags.Instance)
    .Select(x =>
    new
        {
            property = x.Name,
            value = x.GetValue(Bp, null)
        }).ToDictionary(x => x.property, y => y.value.ToString());

因此,您可以在没有事务上下文的情况下进行FS更改。如果在事务上下文中发生某些异常,则可以捕获它并清理FS。

答案 1 :(得分:0)

标准解决方案的工作方式如下。包含回滚中所有必要数据的事件始终从事务方法中发布。仅在回滚的情况下才调用侦听器。

@Transactional
public void executeTransactionCode(final Long id) {
    MyRollbackEvent myRollbackEvent = ... create the event with the necessary data ...
    applicationEventPublisher.publishEvent(myRollbackEvent);
    executeDBCode();
}

还有回滚事件监听器

@TransactionalEventListener(phase = TransactionPhase.AFTER_ROLLBACK)
public void handleRollback(final MyRollbackEvent event) {
    // code to handle rollback, data now available through the event
}

即使侦听器由于异常而失败,回滚仍在执行。