首页 > 其他分享 >策略模式链路任务的抽象异常处理方案

策略模式链路任务的抽象异常处理方案

时间:2024-03-21 18:32:12浏览次数:19  
标签:ChannelStopException 方法 模式 json 抽象 context 链路 异常

1、流程概述

在这里插入图片描述

如上,交易系统会对接很多不同的第三方扣款服务,比如说paypal、onekpay等。交易系统向第三方扣款服务发出请求,然后会收到对应的信息。下层服务包含两个方法,链式调用,也就是第一个方法出错的话,第二个方法也会出错。比如说返回的是json信息,就会对这个json信息解析并处理。但是由于第三方服务的不可控,假如返回了一些非json数据的context,就会导致解析失败,返回null,但不会停止。这个错误的context会继续往下传递,进入到下一个方法,这个方法对这个错误的context处理,从而产生空指针。

所以会导致两个异常:1、第一个方法解析完json得到null,这个null会在被第一个方法的引用中报空指针;2、链式调用,两个方法虽然不会相互调用,但是都是用的同一个context,第一个方法的context已经有问题,所以第二个方法在context的处理上也会出问题,报空指针异常。

我方希望:1、屏蔽掉空指针异常,但如果情况频繁还是要上报;2、假如第一个方法出问题则直接终止链式任务。


2、简单的处理方法

在链式任务开始之前对context做判断,假如是有问题的则抛自定义异常,从而避免了直接抛空指针异常,接着返回,从而避免了链式任务的继续执行。


3、抽象的处理方法

上面的方法虽然简单有效,但有没有办法抽象出来。假如链式方法中出现了别的错误,我们同样希望对抛出自定义异常同时终止链式任务,那应该如何处理?

首先我们定义一个自定义非检查异常ChannelStopException,用于表示链路必须停止的异常,然后再定义一个ChannelMesAnalysisfailException,用于表示报文解析错误的异常,也就是上面讲的第一个链路方法中可能会出现的异常,同时继承ChannelStopException。

public class ChannelStopException extends RuntimeException 

public class ChannelMesAnalysisfailException extends ChannelStopException

然后我们进入到第一个链路方法中,对用于解析json的方法做一下改造,只要解析失败就抛出ChannelMesAnalysisfailException异常,并记录信息。

@Nullable
public static <T> T toBeanChannelMes(String json, Class<T> tClass) {
    try {
        return ObjectMapperConfig.OBJECT_MAPPER.readValue(json, tClass);
    } catch (Exception e) {
      	//抛出自定义异常
        throw new ChannelMesAnalysisfailException("channel message nullpointer");
    }
}

回到执行链路任务的方法,假如第一个链路方法报文解析失败,异常就会往上抛,直到执行链路的方法,我们在这个方法上捕获异常,接着进行判断,假如异常属于必须停止的子类,则直接返回,不执行下一个链路任务,否则做其他处理。

public static void linkExecute(LinkExecutor... executors) {
  	//依次遍历多个方法,在同一条链路顺序执行
    for (LinkExecutor executor : executors) {
        try {
            executor.execute();
        }catch (Exception e){
            if (e instanceof ChannelStopException){
              	//链路中其中一个方法抛出了异常,假如属于必须要停止链路的进行的,则直接返回
                log.error("渠道报文处理异常:{}",e.getMessage());
                return;
            }
            //不需要停止链路进行的,则处理但并不返回
            log.error(e.getMessage());
        }
    }
}

举个例子,第一个链路方法中假如还有其他异常,而且是对下一个链路方法有影响的,我们可以直接抛出针对这个异常的自定义异常,并且继承ChannelStopException,负责执行链路任务的方法捕获之后就可以停止。而假如发生的异常不影响第二个链路的继续执行,我们可以在负责执行链路任务的方法捕获之后的判断新增一条专门处理,而不是直接不执行第二条链路。再或者发生的异常不会影响第一个链路方法的继续执行,我们也可以在第一个链路方法中捕获,但不抛出。

总的来说,这种抽象的处理有两个好处:1、实现了对特定方法发生异常的监控;2、实现对这类链路方法的异常处理的抽象,假如别的异常需要及时停止的异常,我们可以直接继承ChannelStopException。以下是流程图。

在这里插入图片描述

标签:ChannelStopException,方法,模式,json,抽象,context,链路,异常
From: https://blog.csdn.net/weixin_64901910/article/details/136908623

相关文章

  • 解决SpringBoot环境下Redis哨兵模式连接失败问题,“NOAUTH Authentication required”
    io.lettuce.core.RedisCommandExceptionException:“NOAUTHAuthenticationrequired”在某行工作,项目上线代码,uat环境无异常,上到pp环境有问题,报redis连接不上;观察配置,发觉是apollo的配置是哨兵模式,有个哨兵密码。spring2.2.6RELEASE版本问题。于是写了全局配置,读取配置中......
  • 单例模式(上)
    属于创建型模式定义确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。一山不容二虎。2.适用场景ServletContext、ServletConfig、ApplicationContextDBPool。3.常见写法饿汉式单例、懒汉式单例、注册式单例、ThreadLocal式。饿汉式写法publicclassHung......
  • 云效 AppStack + 阿里云 MSE 实现应用服务全链路灰度
    作者:周静、吴宇奇、泮圣伟在应用开发测试验证通过后、进行生产发布前,为了降低新版本发布带来的风险,期望能够先部署到灰度环境,用小部分业务流量进行全链路灰度验证,验证通过后再全量发布生产。本文主要介绍如何通过阿里云MSE微服务引擎和云效应用交付平台AppStack实现灰度发布。......
  • 云效 AppStack + 阿里云 MSE 实现应用服务全链路灰度
    作者:周静、吴宇奇、泮圣伟在应用开发测试验证通过后、进行生产发布前,为了降低新版本发布带来的风险,期望能够先部署到灰度环境,用小部分业务流量进行全链路灰度验证,验证通过后再全量发布生产。本文主要介绍如何通过阿里云MSE微服务引擎和云效应用交付平台AppStack实现灰度发布。......
  • python 多进程并发:生产者+多消费者模式
    多任务场景中,为了节省大量子任务串行执行的耗时,通常采用并发方式充分利用cpu和内存来节省整体任务运行时间。对于多任务并发,常见的做法自然是抽象出功能函数,借助multiprocess类在主进程中并发出多个子进程,或者构建进程池,将任务构造好后丢入进程池中来实现并发。这种方式对于......
  • 如何理解23种设计模式?
    问题:如何理解23设计模式?我是一名python开发者,如何用简短的话语来介绍23设计模式?对我的开发有什么帮助吗?AI回答:设计模式是软件工程中的一套被广泛认可的解决特定问题的模板。它们是在多年的软件开发实践中总结出的有效方法。23种设计模式通常指的是《设计模式:可复用面向对象软......
  • 上门回收小程序开发,打造便利高效的回收模式,提高回收利润
    我国是人口大省,每年都能够产生出大量的废弃可回收物品,废品回收市场具有巨大的发展前景。近几年,随着互联网的发展,打造出了“互联网+回收”模式,居民只需要在手机上预约回收,就可以享受便捷、高效的回收服务。除此之外,回收小程序的出现,也让回收企业得到了快速发展。“互联网+回收......
  • vue2扫码枪串口模式的使用
    1.下载依赖包  serialportnpmiserialport2.创建文件code-gun.jsvar{SerialPort}=require("serialport");//串口列表SerialPort.list().then((ports)=>{ports.forEach((port)=>{console.log(port);});}).catch((err)=&......
  • Java 面向对象编程进阶四(多态、抽象方法抽象类)
    目录多态(polymorphism)多态和类型转换对象的转型(casting) 类型转换异常向下转型中使用instanceof final关键字抽象方法和抽象类抽象类和抽象方法的基本用法多态(polymorphism)        多态指的是同一个方法调用,由于对象不同可能会有不同的行为。现实......
  • 【设计模式】Java 设计模式之责任链模式(Chain of Responsibility)
    责任链模式(ChainofResponsibility)一、概述责任链模式是一种行为设计模式,它允许请求在对象链中传递。每个对象都有机会处理该请求,并且能将其传递给链中的下一个对象。这种模式为请求创建了一个处理对象的链,并沿着这条链传递该请求,直到有一个对象处理它为止。二、模式结......