java根据流程配置文件进行流程动态调度

本文介绍了如何根据配置文件中的步骤调用不同的方法实现流程调度,涉及方法的依赖注入、异常管理和递归执行流程。
摘要由CSDN通过智能技术生成

根据配置文件配置的执行流程来调用方法,其中所有的方法实现同一接口方法handle 实现流程调度处理。
step1:
actor: cn.com.impl.SqlExecute
resources: sqlActor.yml
nextStep: step2
step2:
actor: cn.com.impl.ParseExecute
resources: parseJson.yml
nextStep: step3
step3:
actor: cn.com.impl.ExcelMappingExecute
resources: mapping.yml
nextStep: none

//获取文件流程  
Map<String, Object> steps = yml.load(fileInputStream);

//获取第一步
private Map<String, String> getDataMap(ReportDataPojo data) {
        Map<String, String> firstStepMap = (Map<String, String>) steps.get(firstStep);
        data.setNextStep(firstStepMap.get("nextStep").toString());
        data.setResourceFileName(firstStepMap.get("resources").toString());
        return firstStepMap;
    }

public ReportDataPojo next(ReportDataPojo dataPojo, Map<String, String> nextData)  {
        try {
            //实现依赖注入执行方法
            String classname = (String) nextData.get("actor");
            log.info("将要执行的处理器>>{}",classname);
            Class<?> aClass = Class.forName(classname);
            Object instance = aClass.getDeclaredConstructor().newInstance();
            AutowireCapableBeanFactory beanFactory = AppContextUtil.getApplicationContext().getAutowireCapableBeanFactory();
            beanFactory.autowireBean(instance);
            beanFactory.initializeBean(instance, aClass.getSimpleName());
            Method method = aClass.getDeclaredMethod("handle", ReportDataPojo.class);
            ReportDataPojo data = (ReportDataPojo) method.invoke(instance, dataPojo);
//        //采用接口调用方式执行 如果流程中需要用到注入的类 就不可用 必须先依赖注入才行
//        ExecuteRemoteData execute = (ExecuteRemoteData) aClass.getDeclaredConstructor().newInstance();
//        ReportDataPojo data = execute.handle(dataPojo);
            if (data.getState() == ActorStateEnum.Fail.getState()) {
                return data;
            }
            Map<String, String> nextStepMap = (Map) steps.get(data.getNextStep());
            if (nextStepMap==null){
                //如果没有下一步流程 直接返回
                return data;
            }
            //如有下一步 获取下一步执行的流程 和下一步需要的配置文件
            data.setNextStep(nextStepMap.get("nextStep"));
            data.setResourceFileName(nextStepMap.get("resources"));
            return next(data,nextStepMap);
        } catch (Exception e) {
            log.error("调用流程异常{}",e.toString());
            return dataPojo;
        }
    }

每一步实现类处理各自异常和逻辑就可以。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值