根据配置文件配置的执行流程来调用方法,其中所有的方法实现同一接口方法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;
}
}
每一步实现类处理各自异常和逻辑就可以。