Spring WebFlux -自定义ReactiveTransactionTemplete实现事务

在Spring WebFlux中,由于Mono不支持注解事务,因此需要采用传统方式处理事务。通过分析TransactionAspectSupport和DataSourceTransactionManager的源码,了解事务的执行流程。为优化性能,自定义了ReactiveTransactionTemplate,实现ReactiveTransactionCallback和ReactiveTransactionOperations接口,并确保事务操作在同一线程中进行,以减少资源占用并提升性能。
摘要由CSDN通过智能技术生成

Mono里是不支持注解事务的。
比如

    @Transactional
    public Mono<CommonOutput> save(RecordFileSaveReq req) {
   
        return Mono.just(true)
                .filter(b -> saveLog(req))
                .filter(b -> copyFile(req))
                .filter(b -> removeTempFile(req))
                .map(b -> success());
    }

这样是不行的。

只能回到老办法:

    @Transactional
    public CommonOutput logProcess(RecordFileSaveReq req) {
   
        //保存日志
        repository.save(req);
        String name = storeService.generateName();
        //转储
        storeService.copyFile(req.getVoiceAddress(), "");
        //删除临时文件
        removeTempFile(req);

        return success();
    }

其中,repository.save方法和storeService.copyFile方法都会抛运行时异常。
Controller里的方法就会很罗嗦,要截获异常:

    @PostMapping(name = "/recordFile/save")
    @ResponseBody
    public Mono<CommonOutput> save(@Valid @RequestBody Mono<RecordFileSaveReq> req) {
   
        return Mono.create(sink ->
                req.doOnError(WebExchangeBindException.class, throwable ->
                        sink.success(fail(throwable))
                ).doOnNext(r -> Mono.just(true)
                        .map(b -> service.logProcess(r))
                        .onErrorReturn(RecordObjectException.class, recordObjError())
                        .onErrorReturn(SessionIDTypeException.class, sessionAndTypeError())
                        .onErrorReturn(DataAccessException.class, otherError())
                        .onErrorRet
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值