LiteFlow学习三之业务编排处理之外

简介: LiteFlow学习三之业务编排处理之外

       前面我们已经了解了串行编排和并行编排,了解了两者的执行逻辑,同时都是建立在这两者正常执行情况下,执行的逻辑。那么如果出现chain执行的一系列流程如果出现了异常,此时就需要进行回滚了。如果出现错误或者成功,我们还需要做一些额外的动作的时候,都需要以此为依据来进行的时候,liteflow又是如何处理和留给我们扩展的口子的呢?因此我们来了解一下rollback、onSuccess方法、onError方法是如何执行的。

一、异常回滚的逻辑处理入口

前面我们已经知道,通过chain获取对应的condition,然后通过condition拿到对应的nodeComponent。因此,在处理的过程中,需要对chain.execute(slotIndex)这个方法调用执行try...catch操作。此时可以看到如果当前chain不为空,则此时会打印错误的信息。方便后续日志排查使用。如果为空,依然会进行日志的打印记录。

接着我们可以看到会对槽的信息进行判断,然后设置异常信息。

完成后,会通过槽来获取执行的步骤,也即executeSteps执行步骤。

Deque<CmpStep> executeSteps = slot.getExecuteSteps();
      try {
        Iterator<CmpStep> cmpStepIterator = executeSteps.descendingIterator();
        while(cmpStepIterator.hasNext()) {
          CmpStep cmpStep = cmpStepIterator.next();
          if(cmpStep.getInstance().isRollback()) {
            Rollbackable rollbackItem = cmpStep.getRefNode();
            // 进行回滚
            rollbackItem.rollback(slotIndex);
          }
        }
        //如果出现异常,则打印异常
      } catch (Exception exception) {
        LOG.error(exception.getMessage());
      }
      finally {
        //最终打印回滚步骤
        slot.printRollbackStep();
      }

这里是回滚的主体逻辑。

二、异常逻辑回滚

因此我们需要着重去了解rollback做了什么事情。也即迭代的rollbackItem.rollback(slotIndex)做了什么事情。

首先会把线程属性赋值给组件对象NodeComponent对象。有了nodeComponent的信息之后,执行回滚操作,此时会执行self.rollback()。在此之前会获取槽,然后创建步骤对象cmpStep,添加tag和实例对象、回滚步骤,然后执行回滚操作。可以看到这个方法在是在NodeComponent中的rollback()方法,此时会调用我们自定义的回滚方法,执行回滚动作,也即我们在继承NodeComponent的时候,除了重写process方法之外,还需要重新rollback方法,来执行我们的回滚逻辑,这段逻辑需要我们在业务系统实现。

    public void rollback() throws Exception{
    // 如果需要失败后回滚某个方法,请覆盖这个方法
    };

    完成回滚之后,执行移除,也即removeSlotIndex和removeRefNode。

    三、异常回滚之外

    当然除此之外,我们还可以实现对应的onSuccess方法、onError方法。可以看到在NodeComponent类中,我们可以看到这两个方法都存在,我们都可以选择性的复写,来保证业务的正常执行之外,异常的补偿或者处理等。

    onSuccess方法

    public void onSuccess() throws Exception {
    // 如果需要在成功后回调某一个方法,请覆盖这个方法
    // 全局切面只在spring体系下生效,这里用了spi机制取到相应环境下的实现类
    // 非spring环境下,全局切面为空实现
    CmpAroundAspectHolder.loadCmpAroundAspect().onSuccess(this.self);
    }

    onError方法

    public void onError(Exception e) throws Exception {
    // 如果需要在抛错后回调某一段逻辑,请覆盖这个方法
    // 全局切面只在spring体系下生效,这里用了spi机制取到相应环境下的实现类
    // 非spring环境下,全局切面为空实现
    CmpAroundAspectHolder.loadCmpAroundAspect().onError(this.self, e);
    }

    我们可以对其进行复写,来实现自己的逻辑。

    除此之外,还有一些其他的方法,比如:isContinueOnError出错是否继续执行、isAccess是否进入该节点、是否结束整个流程(不往下继续执行)。

    这些都是liteflow提供给我们的。

    参考:https://gitee.com/dromara/liteFlow

              https://liteflow.cc/


    目录
    相关文章
    |
    测试技术
    |
    26天前
    |
    JSON Go C++
    开发与运维C++问题之在iLogtail新架构中在C++主程序中新增插件的概念如何解决
    开发与运维C++问题之在iLogtail新架构中在C++主程序中新增插件的概念如何解决
    29 1
    |
    28天前
    |
    设计模式 算法 运维
    开发与运维开发问题之什么是模版模式,模版模式在业务接口设计中如何应用
    开发与运维开发问题之什么是模版模式,模版模式在业务接口设计中如何应用
    |
    21天前
    |
    存储 JavaScript Serverless
    函数计算产品使用问题之如何实现项目自动化部署
    函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
    |
    1月前
    |
    缓存 图形学 UED
    U3D开发技术深度解析:异步场景加载与资源管理优化策略
    【7月更文第11天】在Unity3D(简称U3D)游戏开发中,优化场景加载与资源管理是提升用户体验的关键一环。通过实现高效的异步场景加载和智能的资源管理策略,我们能显著缩短玩家的等待时间,提升游戏流畅度。本文将详细介绍这两种技术的应用,并提供实用的代码示例。
    79 0
    |
    3月前
    |
    前端开发
    第8期 volta保证团队开发环境的完全统一
    第8期 volta保证团队开发环境的完全统一
    37 0
    |
    9月前
    |
    数据库
    易搭工作流引擎用是什么开源 还是阿里自研产品,零代码平台场景页面映射数据库表是动态创建,采用什么框架处理,怎么让系统产生高并发能力。易搭权限有没有了解,求解。
    易搭工作流引擎用是什么开源 还是阿里自研产品,零代码平台场景页面映射数据库表是动态创建,采用什么框架处理,怎么让系统产生高并发能力。易搭权限有没有了解,求解。
    |
    人工智能 数据可视化 前端开发
    如何用smardaten无代码平台进行复杂逻辑编排?
    如何用smardaten无代码平台进行复杂逻辑编排?
    「业务架构」定义业务能力-备忘单
    「业务架构」定义业务能力-备忘单
    |
    Serverless
    Serverless 另一个核心要素是“被集成”,被集成的对象有两类
    Serverless 另一个核心要素是“被集成”,被集成的对象有两类自制脑图
    104 0
    Serverless 另一个核心要素是“被集成”,被集成的对象有两类