activiti流程引擎开发指南
安装插件
参考链接:https://blog.csdn.net/x15011238662/article/details/86488754
解决乱码问题
1.idea安装目录bin目录下如下图所示两个文件 :
idea64.exe.vmoptions/idea.exe.vmoptions 添加 -Dfile.encoding=UTF-8
2.修改如下目录文件
C:\Users\Administrator\.IntelliJIdea2019.2\config\idea64.exe.vmoptions 添加 -Dfile.encoding=UTF-8
新建bpmn文件
元素列表
我们主要用到的元素为:开始节点、结束节点、UserTask、ExclusiveGateway
画图规则
- 必须包含起始节点、结束节点,至少有一个UserTask节点,至少有一条完整的流程线路,额外的孤立节点,不会解析。
- 互斥网关上一个节点必须是UserTask类型
集成actitivi
引入POM依赖
<dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter-basic</artifactId> <version>6.0.0</version> </dependency> |
启动文件排除
@SpringBootApplication(exclude = org.activiti.spring.boot.SecurityAutoConfiguration.class) public class RcApplication { public static void main(String[] args) { SpringApplication.run(RcApplication.class, args); } } |
添加配置类
package cn.cloudedu.rc.base.config; import org.activiti.engine.*; import org.activiti.spring.ProcessEngineFactoryBean; import org.activiti.spring.SpringProcessEngineConfiguration; import org.activiti.spring.boot.AbstractProcessEngineAutoConfiguration; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.transaction.PlatformTransactionManager;
import javax.sql.DataSource; import java.io.IOException;
/** * activiti 配置类 * 初始化activiti,注入相关的bean供后续使用 * @author liubiao * @date 2019.11.1 */ @Configuration public class ActivitiConfig extends AbstractProcessEngineAutoConfiguration { private final DataSource dataSource; private final PlatformTransactionManager platformTransactionManager;
@Autowired public ActivitiConfig( @Qualifier("dataSource") DataSource dataSource, @Qualifier("transactionManager") PlatformTransactionManager platformTransactionManager) { this.dataSource = dataSource; this.platformTransactionManager = platformTransactionManager; }
@Bean public SpringProcessEngineConfiguration springProcessEngineConfiguration() { SpringProcessEngineConfiguration spec = new SpringProcessEngineConfiguration(); spec.setDataSource(dataSource); spec.setTransactionManager(platformTransactionManager); spec.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);//DB_SCHEMA_UPDATE_FALSE Resource[] resources = null; // 启动自动部署流程 try { resources = new PathMatchingResourcePatternResolver().getResources("classpath*:process/*.bpmn"); } catch (IOException e) { e.printStackTrace(); } spec.setDeploymentResources(resources); return spec; } @Bean public ProcessEngineFactoryBean processEngineFactory() { ProcessEngineFactoryBean processEngineFactoryBean = new ProcessEngineFactoryBean(); processEngineFactoryBean.setProcessEngineConfiguration(springProcessEngineConfiguration()); return processEngineFactoryBean; } @Bean public ProcessEngine processEngine() throws Exception { return processEngineFactory().getObject(); }
@Bean public RepositoryService repositoryService() throws Exception { return processEngineFactory().getObject().getRepositoryService(); } @Bean public RuntimeService runtimeService() throws Exception { return processEngineFactory().getObject().getRuntimeService(); } @Bean public TaskService taskService() throws Exception { return processEngineFactory().getObject().getTaskService(); } @Bean public HistoryService historyService() throws Exception { return processEngineFactory().getObject().getHistoryService(); } } |
执行过程说明
流程部署
Deployment deployment = repositoryService.createDeployment().addInputStream(fileName,file.getInputStream()).deploy(); String deploymentId = deployment.getId(); //根据部署ID获取流程定义实例 ProcessDefinition processDefinition = processEngine.getRepositoryService() .createProcessDefinitionQuery().deploymentId(deploymentId).singleResult(); String definitionId = processDefinition.getId(); |
流程启动
//根据部署流程ID启动流程 ProcessInstance processInstance = runtimeService.startProcessInstanceById(definitionId); String processInstanceId = processInstance.getProcessInstanceId(); |
流程流转
Task task = taskService.createTaskQuery().processInstanceId(procInstanceId).singleResult(); Map<String,Object> condition = new HashMap<>(); condition.put("result",params.get("condition")); taskService.complete(task.getId(),condition); |
查看流程状态
//获取当前节点 Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult(); BpmnModel bpmnModel = processEngine.getRepositoryService().getBpmnModel(task.getProcessDefinitionId()); FlowNode flowNode = (FlowNode) bpmnModel.getFlowElement(activityId); flowNode.getName(); flowNode.getId(); //获取该流程组件的之后/之前的组件信息 List<SequenceFlow> sequenceFlowListOutGoing = flowNode.getOutgoingFlows(); //sequenceFlowListOutGoing数量可能大于1,可以自己做判断,此处只取第一个 FlowElement flowElement = sequenceFlowListOutGoing.get(0).getTargetFlowElement(); if(flowElement instanceof ExclusiveGateway){ oprList.clear(); ExclusiveGateway gateway = (ExclusiveGateway) flowElement; List<SequenceFlow> list = gateway.getOutgoingFlows(); for(SequenceFlow flow:list){ flow.getName(); String condition = flow.getConditionExpression(); } } |