在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?)
}
但是,在该事件侦听器中,我需要路径的属性value
和fileName
才能知道要删除哪个文件。但我认为导致回滚的事件将由Spring触发,并且我无法将值与之一起传递。
那我该如何处理回滚?
答案 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
}
即使侦听器由于异常而失败,回滚仍在执行。