Удалить файл из файловой системы после отката транзакции - PullRequest
0 голосов
/ 15 октября 2018

В приложении 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, и я не могу передать значения вместе с ним.

Итак, как я могу обработать откат?

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Стандартное решение работает следующим образом.Событие, содержащее все данные, необходимые для отката, всегда публикуется из транзакционного метода.Слушатель вызывается только в случае отката.

@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
}

Даже если прослушиватель завершается неудачно с исключением, откат все еще выполняется.

0 голосов
/ 15 октября 2018

Вы можете попробовать следующую архитектуру:

@Service
class DbService {
   @Transactional
   public void doInDb() {}
}

@Service
class DomainService {
    @Autowired DbService dbService;
    @Autowired FsService fsService;
    ...
    public void doDbAndFs() {
       try {
         fsService.saveFiles();
         dbService.doInDb();
       } catch (Exception e) {
          fsService.cleanUp();
       }

    }
}

Таким образом, вы вносите изменения в FS без транзакционного контекста.Если в транзакционном контексте происходит какое-то исключение, вы перехватываете его и выполняете очистку FS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...