因为最近在搞一些工作流的事情,而传统的Activity等工作流又太重,不太适合我们的系统,所以在网上找到了Apache Commons Chain这个实现比较轻的Command模式与责任链模式结合的工作流实现。
这个架构主要有Command、ChainBase、ContextBase三个角色,command可以扩展你的单个流程(或者说审核步骤),chainBase用来添加这个工作流中应该包含哪些流程或步骤(addCommand),ContextBase用来自定义这个流中的参数。
首先引入依赖
<dependency><groupId>commons-chain</groupId><artifactId>commons-chain</artifactId><version>1.2</version></dependency>
编写contextBase
/*** @author xiong* @Date /3/13* @Version 1.0*/@Data@Builderpublic class MyContext extends ContextBase {private Long roleId;//当前操作人的角色编号private Integer checkStatus;//当前动作审核状态 -1:审核不通过 0:待审核 1:审核通过private String opinion;//审核意见.........}
编写command
/*** @author xiong* @Date /3/13* @Version 1.0*/public class CommitCommand implements Command{@Overridepublic void execute(Context context){MyContext myContext = (MyContext) context;//如果满足某某条件 就执行以下操作 if (myContext.getRoleId().equals(BUSINESS_ROLEID)){............} }}
/*** @author xiong* @Date /3/13* @Version 1.0*/public class StepOneCheckCommand implements Command {@Overridepublic void execute(Context context){MyContext myContext = (MyContext) context;//如果满足是部门领导人的条件 就执行以下操作 if (myContext.getRoleId().equals(DEPARTMENT_LEADER_ROLEID)){............}}}
/*** @author xiong* @Date /3/13* @Version 1.0*/public class StepTwoCheckCommand implements Approver {@Overridepublic void execute(Context context){MyContext myContext = (MyContext) context;//如果满足是CEO的条件 就执行以下操作 if (myContext.getRoleId().equals(CEO_ROLEID)){............}}}
编写ChainBase
/*** @author xiong* @Date /3/13* @Version 1.0*/@Componentpublic class MyChain extends ChainBase {public void init(MyContext myContext) {init0();.........//给当前流添加command(命令已经在项目启动时缓存在了项目缓存中)//CACHE_COMMAND可以理解为上面3个命令的listCACHE_COMMAND.stream().forEach(e -> this.addCommand(e));}/*** 初始化工作流中的命令数量以及 命令的执行状态*/private void init0(){this.frozen = false;mands = new Command[0];}}