【问题标题】:spring boot execution of two dependent methodsspring boot 执行两个依赖方法
【发布时间】:2020-02-17 13:58:32
【问题描述】:

我正在开发一个使用 Spring Boot 作为框架的应用程序。我有两种方法,第一种是从数据库中删除数据,另一种是从磁盘中删除文件夹,所以如果我从数据库中删除并且我无法从磁盘中删除,那么所有操作都会失败。那么我怎么能用springboot做到这一点?

@Override
public ResponseEntity<?> delete(Long id) {
    return libelleRepository.findById(id).map(libelle -> {
        libelleRepository.delete(libelle);
        return ResponseEntity.ok().build();
    }).orElseThrow(() -> new GeneralResourceNotFoundException("Libelle not found with id " + id));

}

【问题讨论】:

    标签: java spring-boot


    【解决方案1】:

    您可以使用 Spring 的 @Transactional 来执行此操作。

    这是我尝试过的示例代码。在我尝试创建文件的示例中,它执行数据库操作,然后执行文件操作。首先在执行数据库操作之前创建文件并使用TransactionSynchronizationAdapter 确保事务在提交之前完成。

    代码:

    @Autowired
        private UserService userService;
    
        @Transactional
        public String doFileOperation() {
    
            File testFile = new File("C:\\test.txt");
            TxnListener transactionListener = new TxnListener(testFile);
            TransactionSynchronizationManager.registerSynchronization(transactionListener);
            // DB Operation
            userService.addUser();
            // File Operation
            List<String> lines = Arrays.asList("1st line", "2nd line");
    
            try {
                Files.write(Paths.get(testFile.getPath()),
                        lines,
                        StandardCharsets.UTF_8,
                        StandardOpenOption.CREATE,
                        StandardOpenOption.APPEND);
            } catch (IOException e) {
                e.printStackTrace();
            }
    
    
            return "";
        }
    
    public class TxnListener extends TransactionSynchronizationAdapter {
        private File outputFile;
    
        public TxnListener(File outputFile) {
            this.outputFile = outputFile;
        }
    
        @Override
        public void afterCompletion(int status) {
            if (STATUS_COMMITTED != status) {
                if (outputFile.exists()) {
                    if (!outputFile.delete()) {
                        System.out.println("Could not delete File" + outputFile.getPath() + " after failed transaction");
                    }
                }
            }
        }
    }
    

    如果在数据库操作过程中出现异常,afterCompletion 将被调用并删除文件。

    这样可以保持操作的原子性。

    【讨论】:

      猜你喜欢
      • 2022-08-20
      • 2020-09-10
      • 2019-02-26
      • 1970-01-01
      • 2016-09-05
      • 2018-05-13
      • 2018-11-21
      • 2017-03-03
      • 1970-01-01
      相关资源
      最近更新 更多