Seata分布式事务失效场景

news2024/11/26 2:52:23

场景:

  1. Feign熔断降级;
  2. 被调用服务全局异常捕获了;

解决方案:

  1. 将需要分布式事务的调用链异常一直往上抛出去; 参考:https://blog.csdn.net/qq_16468489/article/details/121798016
  2. 手动开启全局事务并进行回滚 ;参考:https://blog.csdn.net/qq_36155375/article/details/115950439

方案1示例:

        1.Feign熔断降级,在FallbackFactory中继续往上抛出。

      2.被调用服务全局异常捕获了,在Feign结果解析器中对返回结果进行判断,然后抛出异常,注意:解析器中抛出的异常会继续被FallbackFactory的默认实现捕获,需要在Feign熔断降级中将异常继续往上抛出(如上图)。

package com.lbdj.app.feign.workerorder;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import feign.Response;
import feign.Util;
import feign.codec.Decoder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.support.SpringDecoder;
import java.io.IOException;
import java.lang.reflect.Type;
import java.nio.charset.StandardCharsets;
import java.util.Objects;

@Slf4j
public class ResultStatusDecoder implements Decoder{

    final SpringDecoder delegate;

    public ResultStatusDecoder(SpringDecoder delegate) {
        Objects.requireNonNull(delegate, "Decoder must not be null. ");
        this.delegate = delegate;
    }

    @Override
    public Object decode(Response response, Type type) throws IOException {
        String resultStr = Util.toString(response.body().asReader(Util.UTF_8));
        log.info("进来了 ,result msg ->{}",resultStr);
        JSONObject jsonObject = JSONUtil.parseObj(resultStr);
        if(jsonObject.containsKey("code")){
            String code = jsonObject.getStr("code");
            if("200".equals(code)){
                throw new RuntimeException("我知道错了");
            }
        }
        //回写body,因为response的流数据只能读一次,这里回写后重新生成response
        return delegate.decode(response.toBuilder().body(resultStr, StandardCharsets.UTF_8).build(), type);
    }
}
package com.lbdj.app.feign.workerorder;

import feign.codec.Decoder;
import feign.optionals.OptionalDecoder;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.cloud.openfeign.support.ResponseEntityDecoder;
import org.springframework.cloud.openfeign.support.SpringDecoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class CustomizedConfiguration {
    @Bean
    public Decoder decoder(ObjectProvider<HttpMessageConverters> messageConverters){
        return new OptionalDecoder((new ResponseEntityDecoder(new ResultStatusDecoder(new SpringDecoder(messageConverters)))));
    }
}

Tip:Feign调用出现异常时如果没写FallbackFactory,或在FallbackFactory中继续往上抛出,则程序会因为异常执行中断;如果写了FallbackFactory,没有往上抛出异常,程序会继续执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/746576.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

观察者(Observer)模式

目录 使用场景参与者协作效果实现类图 观察者(Observer)又被称为 发布-订阅模式&#xff0c;是一种对象行为模式&#xff0c;定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时所有依赖于它的对象都得到通知并自动更新。通知的发布者&#xff08;目标&a…

校园跑腿小程序都包括哪些业务呢?

校园创业&#xff0c;大家都知道&#xff0c;一直以来是个非常火热的话题&#xff0c;每位步入大学校园的学子们都有过在校创业的想法&#xff0c;包括我们一些有着学校资源的社会创业者们&#xff0c;早已经看好了中国高校这块巨大的市场。 在这里&#xff0c;我要跟大家分享…

面向对象进阶二(包、final、权限修饰符、代码块、abstract、接口、内部类)

面向对象进阶二 一、包、final、权限修饰符、代码块1.1 包1.2 final关键字1.3 权限修饰符1.4 代码块1.4.1 局部代码块&#xff08;已淘汰&#xff0c;了解&#xff09;1.4.2 构造代码块&#xff08;了解内容&#xff09;1.4.3 静态代码块 二、抽象方法和抽象类三、接口3.1 接口…

解释 void 类型转换: (void)++y

谢谢大师们的指导&#xff0c;保存&#xff0c;分享

【LeetCode】HOT 100(23)

题单介绍&#xff1a; 精选 100 道力扣&#xff08;LeetCode&#xff09;上最热门的题目&#xff0c;适合初识算法与数据结构的新手和想要在短时间内高效提升的人&#xff0c;熟练掌握这 100 道题&#xff0c;你就已经具备了在代码世界通行的基本能力。 目录 题单介绍&#…

JS语法学习实战系列

JS学习实战系列 一、数据类型二、运算符三、流程控制四、let 、var、 const 声明变量的区别 JavaScript&#xff08;简称“JS”&#xff09; 是一种具有函数优先的轻量级&#xff0c;解释型或即时编译型的编程语言。虽然它是作为开发Web页面的脚本语言而出名&#xff0c;但是它…

电路维修(双端队列bfs)

题意&#xff1a;从左上角走到右下角&#xff0c;且只能走斜线&#xff0c;斜线可以旋转&#xff0c;旋转斜线那么走过这条线&#xff0c;那么距离就加1&#xff0c;求最小的距离。 分析&#xff1a;有一个性质&#xff0c;因为起点是偶数点(0,0),那么它只能走到偶数点&#x…

进程间通信-有名管道

理解&#xff1a;有名管道类似于文件io 相当于新建一个管道文件作为中间介质 进行数据的交换&#xff08;因此可以不同线程间通信&#xff09; 写入管道文件 #include <sys/types.h> #include <sys/stat.h> #include <stdio.h> #include <stdlib.h> #…

菜鸡shader:L9 屏幕UV及屏幕UV扰动

文章目录 屏幕UV代码最后效果 屏幕UV扰动代码最后效果 屏幕UV 最主要的代码是屏幕UV的获取&#xff1a; 这里具体可以参考这位大佬的博客&#xff1a; 个人学习笔记——庄懂的技术美术入门课&#xff08;美术向&#xff09;17&#xff08;VS空间畸变矫正的原理&#xff09;个…

驱动程序设计 Linux设备驱动中的阻塞与非阻塞IO、信号与函数 7.12

linux设备驱动中的阻塞与非阻塞I/O 阻塞&#xff1a;等待某种资源&#xff0c;如果获取不到&#xff0c;就会把当前任务挂起&#xff0c;等待资源准备好 1. int flag 0; while(flag 0); 2.等待队列 wait_event(q,flag > 0); wakeup(q);非阻塞&#xff1a;等待某种资源非…

nodejs中使用Redis

安装教程&#xff1a;Redis 安装 | 菜鸟教程 redis下载链接&#xff1a;Release Redis for Windows 5.0.14.1 tporadowski/redis GitHub解压双击redis-server.exe启动服务器端双击redis-cil.exe启动客户端连接服务端在客户端看看能不能ping通 完成 遇到的问题1&#x…

前端处理后端返回的文件流,进行文件下载

二进制流格式 Blob格式 前言&#xff1a; 需求&#xff1a;根据后端接口返回的文件流进行数据处理&#xff0c;并实现文件的下载&#xff0c;且下载文件为word文档. 代码实现&#xff1a; //下载文件 async function DownLoadFile(row) {let res await DownLoadFileAPI(row.…

火山引擎 DataLeap 构建Data Catalog系统的实践(二):技术与产品概览

技术与产品概览 架构设计 元数据的接入 元数据接入支持T1和近实时两种方式 上游系统&#xff1a;包括各类存储系统&#xff08;比如Hive、 Clickhouse等&#xff09;和业务系统&#xff08;比如数据开发平台、数据质量平台等&#xff09; 中间层&#xff1a; ETL Bridge&#x…

PCL点云处理之最小二乘直线拟合(❤❤❤亲测可用❤❤❤)(二百)

PCL点云处理之最小二乘直线拟合(❤❤❤亲测可用❤❤❤)(二百) 一、算法介绍二、具体代码1.代码2.结果一、算法介绍 点云近似于直线分布,但相对要散乱一些,此时,最小二乘直线拟合,是一种最常用的拟合方法,可以从中找到最优的直线方程,用于描述点云的分布情况。网上介…

Yjmstr的算法竞赛模板(updating)

YJMSTR的算法竞赛模板 目录 文章目录 YJMSTR的算法竞赛模板目录图论一、最短路1.spfa与负环、最短路1.1 bfs-spfa找负环&#xff1a;1.2 dfs-spfa找负环1.3 spfa求最短路的优化 2.dijkstra模板&#xff08;set模拟二叉堆堆优化)2.1有向图最小环 3.Floyd求多源最短路/传递闭包/…

ARM Coresight 系列文章 7 - ARM Coresight 通过 AHB-AP 访问 cpu 内部 coresight 组件

文章目录 如下图所示&#xff0c;如果A78想去访问M33的内部 coresight 组件 ETM&#xff0c;需要要怎么做&#xff1f; 答案也正是在图中&#xff0c;首先A78 通过AXI 互联&#xff0c;接入到 APBIC 的 slave port&#xff0c;再通过APBIC 的 master 送出&#xff0c;而APBIC中…

【win11】将一个程序设置为开机启动

Windows 在 Windows 系统中&#xff0c;可以通过在 “启动” 文件夹中放置程序的快捷方式来实现开机启动。 按照以下步骤操作&#xff1a; 按 Win R 打开 “运行” 对话框&#xff0c;输入 shell:startup&#xff0c;然后按回车。这将打开 “启动” 文件夹。 找到你想设置…

自由视点合成中的表征学习(二)

三维重建以及神经渲染中的学习 公众号AI知识物语 本文内容为参加过去一次暑期课程学习时的笔记&#xff0c;浅浅记录下。 自由视点合成中的表征学习 目标&#xff1a;给定单一场景多个图片以及相机位子&#xff0c;生成新视角下的图像 挑战&#xff1a;恢复三维场景结构&…

Stable Diffusion (持续更新)

引言 本文的目的为记录stable diffusion的风格迁移&#xff0c;采用diffusers example中的text_to_image和textual_inversion目录 2023.7.11 收集了6张水墨画风格的图片&#xff0c;采用textual_inversion进行训练&#xff0c;以"The street of Paris, in the style of …