因为最近在搞一些工作流的事情,而传统的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];
}
}