本来这篇博客应该早一点写,已经过去快两个月了,之前在公司一个项目组开发了基于Activiti流程系统设计。其实技术层面上很简单,就是封装成与项目或者说自身系统相关的一套API,便于其他开发人员使用,让开发人员在使用工作流的时候很方便。本来业务流程和业务就应该解耦合,这里就会涉及到抽象设计(所有业务类继承工作流抽象类),这也是我们在设计业务框架必备的,这里就不啰嗦抽象设计相关的了。
做过J2EE相关业务系统对JBPM并不陌生,今天我们将揭开它的一层面纱,工作流一种抽象的概念,对于工作流引擎的解释请参考百度百科:工作流引擎,我们软件工程师的职责就将抽象编程现实,很多语言都应该有这方面的解决方案,目前也有很多公司专注于这块的解决方案。
Java这块是之前一直是JBPM, Activity与JBPM是什么关系呢? 这里就是一些八卦的事情了.........。对于我这这种喜欢八卦的人来说,下面是我找到的Activi八卦段落,IT是一种文化,而不再是一种技能.....。就像我们喜欢去阅读一些计算机发展史一样。
对jBPM来说,今年最大的事件莫过于jBPM的创建者Tom Baeyens离开JBoss了。Tom Baeyens离开的具体原因尚不清楚,但他的离开产生了两个结果:一是jBPM的下一个版本jBPM5完全放弃了jBPM4的基础代码,基于Drools Flow重头来过;二是Tom Baeyens加入Alfresco后很快推出了新的基于jBPM4的开源工作流系统Activiti。由此不难推测Tom Baeyens离开的部分原因:JBoss内部对jBPM未来版本的架构实现产生了严重的意见分歧。更加巧合的是12月1日Activiti5刚发布,紧接着12月2日jBPM5就发布了第一个候选发布版本,jBPM与Activiti之间的微妙关系可见一般。
废话少说,上代码,也许这才是实际该干的事情,环境搭建这类似的问题,我就不介绍了。
1、这是Activiti的一些基于Spring的服务注入,因为涉及到保密的原因,与业务相关的代码我是做了部分处理。
/**
*
* <p>Title: JBPM核心业务抽象类
* <p>版本:1.0
* <p>Company:XX信息系统有限公司</p>
* <p>作者: 左钦菠
* <p>创建时间:2014-11-13
* @author zuoqinbo
* <p>部门:软件所
* <p>修改者:zuoqb
* <p>修改时间:下午07:06:47
*/
public abstract class JBPMService {
/**
* 流程引擎
*/
@Autowired
protected ProcessEngine ProcessEngine;
/**
* 流程引擎任务服务
*/
@Autowired
private TaskService taskService;
/**
* 流程定义接服务
*/
@Autowired
private RepositoryService repositoryService;
/**
* 流程引擎正在执行服务
*/
@Autowired
private RuntimeService runtimeService;
}
2、开始开启一个工作流程,传入的就是业务单据唯一编号,这样就可以通过业务编号去查找该工作流程处于哪一环节。
/**
*
*方法说明: 启动流程引擎
*@param
*@return void
*@author zuoqinbo
* @throws Exception
*@throws
*@创建时间 2014-11-19
*/
public void startProcess(String businessKey) throws Exception{
try {
Map<String , Object> variable = new HashMap<String, Object>();
String businessProcessModule = getProcessModule();//流程图变更时,新发起流程模板就选择当前最新的模板
ProcessInstance instance = runtimeService.startProcessInstanceByKey(businessProcessModule,businessKey, variable);//开始流转
Task task = taskService.createTaskQuery().executionId(instance.getId()).singleResult();//第一个节点任务提交
taskService.complete(task.getId());//过了启动环节之后,流程流转到下一个环节
saveDBSY(businessProcessModule,businessKey);//保存到待办事宜信息
}catch (Exception e) {
throw new RuntimeException("流程引擎启动报错:"+e);
}
}
3、下面这个方法就是流程流转,我理解的也是首次是这样理解流程的,但是不知道是不对的,如有看到这样理解不准确的,请留言。流程继续往下走,要么是True或者是false,就是就是nextProcess()
/**
*
*方法说明:流程流转其实就是往下一个流程的进行,
*不需要进行判断什么状态和什么业务方法进行绑定,传入审批结果和审批意见就行
*@return void
*@author zuoqinbo
* @throws Exception
*@创建时间 2014-11-18
*/
public void nextProcess(String businessKey,String spjg,String spyj) throws Exception{
String businessProcessModule = getProcessModule(businessKey);//新发起一个流程就选择当前最新的模板、如果流程已经在运行中,那么就选择待办事项中的流程图模板
ProcessInstance instance = runtimeService.createProcessInstanceQuery().processInstanceBusinessKey(businessKey,businessProcessModule).singleResult(); //再次获取实例对象
if(instance==null){
throw new RuntimeException("该业务在流程引擎中不存在");
}
String executionId = instance.getId();//根据流程实例找到对应的任务
Task task = taskService.createTaskQuery().executionId(executionId).singleResult();//获取到任务实例
Map<String , Object> variables = getPassConditionMap(spjg, businessKey);
taskService.complete(task.getId(),variables); //提交任务(审批完毕)
task = taskService.createTaskQuery().executionId(executionId).singleResult();//想判断出是终审结束还是不继续结束
String processStatusMC = "已终审结束";//终审
String processStatus = "结束";
if(task!=null){
processStatusMC = task.getName();//获取已经到的流程环节名称和状态更新代办事宜
processStatus = "审核中";//更新代办事宜 获取最新的任务在哪个环节,如果流程结束则没有任务了
}else{//如果是终审
dealFinalBusiness(businessKey);//如果是终审就执行终审业务
}
updateDBSY(businessKey,processStatusMC,processStatus,spjg,spyj);//更新代办事宜
}