本文的内容主要是基于activiti(5.22)与springBoot集成在线的流程设计器。以及对activiti工作流程的一个初探。
springBoot整合activiti流程设计器demo
先下载demo在来看这篇文章。
文章首发橙寂博客转载请加上谢谢。
如果您需要学习整合activiti建议您下载我的源码我的源码是已经整合好的而且排了坑。我的文章内容不会教你一步步整合,我会讲一些我遇到的一些坑以及解决办法。下载我的源码是可以直接运行的然后访问
http://localhost:8080/act/model/add就可以看到流程设计页面。
建议自己先走一遍在来看文章效果更佳。
activiti是工作流引擎。是由Alfresco软件开源的一个项目。它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。
开发人员可以通过插件直接绘画出业务流程图。ProcessEngine:ProcessEngine对象是activiti的工作流引擎。负责生成流程运行时的各种实例及数据、监控和管理流程的运行。
BPMN:业务流程建模与标注(Business Process Model and Notation,BPMN),描述流程的基本符号,包括这些图元如何组合成一个业务流程图。
接下来我们做一些简单的准备
需要一个在线的流程设计器的war包。官网可以下。activiti官网
mysql数据库。官网下mysql官网
我的整个项目源码springBoot整合activiti流程设计器demo
下载了我的项目源码只需要准备一个mysql数据库就行了。
org.activiti
activiti-spring-boot-starter-basic
${activiti.version}
org.mybatis
mybatis
org.activiti
activiti-engine
${activiti.version}
org.mybatis
mybatis
org.activiti
activiti-spring
${activiti.version}
org.activiti
activiti-modeler
${activiti.version}
org.activiti
activiti-diagram-rest
${activiti.version}
可以看到这里同样需要去除了mybatis的包。同时我们在启动类上需要排除掉org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class这个自动整合类。
@EnableAutoConfiguration(exclude = {
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class
})
(Business Process Diagram)数据库:Activiti的后台是有数据库的支持,所有的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。 用途也和服务的API对应。
坑踩完了开始使用了。在这里大家首先会去认识到哪个步骤需要用哪个业务类去操作。并且这个类的一些操作对应的表会有哪些变化。
这里代码没贴全创建跟保存我是分开的。这个创建出来的是空的,当流程设计完毕后会调用保存方法,我的源码中saveModel这个方法就是保存的。
在这个步骤要做很多事,也是核心。工作流的走向,审批人是谁等等。在这一步就要指定好。
repositoryService这个类主要是用来操作跟模型相关的。
try {
Model model = repositoryService.newModel();
//设置一些默认信息
String name = "new-process";
String description = "";
int revision = 1;
String key = "process";
ObjectNode modelNode = objectMapper.createObjectNode();
modelNode.put(ModelDataJsonConstants.MODEL_NAME, name);
modelNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, description);
modelNode.put(ModelDataJsonConstants.MODEL_REVISION, revision);
model.setName(name);
model.setKey(key);
model.setMetaInfo(modelNode.toString());
repositoryService.saveModel(model);
创建后act_re_model会多了一条记录
值得一提的是如果工作流对应的其实是一个xml文件,也就是设计出来的最终的效果是一个xml文件。所以部署流程也就是部署这个文件。同个文件可以部署多次。对应的是更新版本。
在我给大家提供的项目中会有下载流程xml文件的接口。exportToXml也就是这个方法把模型id传过去就可以看到了。
2. 部署模型
部署我们根据模型的唯一id去部署
部署也是操作模型所以这里还是使用repositoryService这个类
//获取模型
Model modelData = repositoryService.getModel(id);
byte[] bytes = repositoryService.getModelEditorSource(modelData.getId());
if (bytes == null) {
return "fail";
}
JsonNode modelNode = null;
try {
modelNode = new ObjectMapper().readTree(bytes);
} catch (IOException e) {
e.printStackTrace();
return "fail";
}
BpmnModel model = new BpmnJsonConverter().convertToBpmnModel(modelNode);
if (model.getProcesses().size() == 0) {
return "fail";
}
byte[] bpmnBytes = new BpmnXMLConverter().convertToXML(model);
//发布流程
String processName = modelData.getName() + ".bpmn20.xml";
Deployment deployment = null;
try {
deployment = repositoryService.createDeployment()
.name(modelData.getName())
.addString(processName, new String(bpmnBytes, "UTF-8"))
.deploy();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return "fail";
}
modelData.setDeploymentId(deployment.getId());
repositoryService.saveModel(modelData);
return "success";
部署后act_re_procdef,act_re_deployment会新增一条数据
act_ge_bytearray(新增两条一个流程文件一个流程图)
runtimeService在运行时操作任务就需要用到这个类。
identityService看名字也知道操作用户或者角色的信息的业务类。
//设置发起者
identityService.setAuthenticatedUserId(id);
// 启动流程 key:要启动的模型的key businessId:业务的id
ProcessInstance procIns = runtimeService.startProcessInstanceByKey("key","businessId");
启动后act_ru_task会新增一条记录act_hi_actinst会新增两条一个提交一个待审批的记录act_hi_taskinst会新增一条act_hi_procinst会新增一条。act_hi_identitylink会跟据模型生成对应的人员关系
审批对应的操作在工作流中会使用到taskService这个类。
在这一步有别的业务就需要调用别的业务类了。
//pass 这个参数 1代表审批通过 0代表审批拒绝 这个使用了排他网关是在流程图定义时做好的。
Map vars = new HashMap<>(16);
vars.put("pass", 1 );
taskService.complete("37505",vars);
启动act_ru_task会新增一条记录(把原先那个id给删了)act_hi_actinst会新增一条一个待审批的记录act_hi_taskinst会新增一条act_hi_procinst会新增一条。(如果审批完了act_ru_task就没有记录了)
上文中用到了几个核心的service activiti还内置了其他几个service
HistoryService是activiti的查询历史信息的类。
在一个流程执行完成后,这个对象为我们提供查询历史信息。
FormService 一个可选服务,任务表单管理
这个service我目前没有使用到他的功能。等我使用到了我再来补充。
这里有篇博客详解这个service是干嘛的
activiti的FormService的使用
activiti的初探功能,相信看了这篇文章写一个请假流程的demo大家应该是没问题的。我接下来会一直更新这篇文章。跟大家一同探索工作流