因为最近在搞一些工作流的事情,而传统的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 2020/3/13
 * @Version 1.0
 */
@Data
@Builder
public class MyContext extends ContextBase {

    private Long roleId;//当前操作人的角色编号

    private Integer checkStatus;//当前动作审核状态 -1:审核不通过  0:待审核   1:审核通过

    private String opinion;//审核意见
    ...
    ...
    ...
}

编写command

/**
 * @author xiong
 * @Date 2020/3/13
 * @Version 1.0
 */
public class CommitCommand implements Command{

    @Override
    public void execute(Context context){
    	MyContext myContext = (MyContext) context;
        //如果满足某某条件  就执行以下操作   
	    if (myContext.getRoleId().equals(BUSINESS_ROLEID)){
	         ....
	         ....
	         ....
	     } 
    }
}
/**
 * @author xiong
 * @Date 2020/3/13
 * @Version 1.0
 */
public class StepOneCheckCommand implements Command {

    @Override
    public void execute(Context context){
        MyContext myContext = (MyContext) context;
        //如果满足是部门领导人的条件  就执行以下操作 
        if (myContext.getRoleId().equals(DEPARTMENT_LEADER_ROLEID)){
            ....
            ....
            ....
        }
    }
}
/**
 * @author xiong
 * @Date 2020/3/13
 * @Version 1.0
 */
public class StepTwoCheckCommand implements Approver {

    @Override
    public void execute(Context context){
    	MyContext myContext = (MyContext) context;
        //如果满足是CEO的条件  就执行以下操作 
        if (myContext.getRoleId().equals(CEO_ROLEID)){
            ....
            ....
            ....
        }
    }
}

编写ChainBase

/**
 * @author xiong
 * @Date 2020/3/13
 * @Version 1.0
 */
@Component
public class MyChain extends ChainBase {

    public void init(MyContext myContext) {
        init0();
        ...
        ...
        ...
        //给当前流添加command(命令已经在项目启动时缓存在了项目缓存中)
        //CACHE_COMMAND可以理解为上面3个命令的list
 		CACHE_COMMAND.stream().forEach(e -> this.addCommand(e));
 		
        }
    

    /**
     * 初始化工作流中的命令数量以及  命令的执行状态
     */
    private void init0(){
        this.frozen = false;
        this.commands = new Command[0];
    }

}
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐