camunda日常操作
camunda多数据源,即业务数据库与camunda数据库分开
业务数据库正常配置在application.yml中。添加camunda配置类
package com.example.workflow; import org.camunda.bpm.engine.impl.cfg.StandaloneProcessEngineConfiguration; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; @Configuration public class MyCamundaProcessEngineConfiguration extends StandaloneProcessEngineConfiguration { @Value("${camunda.db.url}") private String jdbcUrl; @Value("${camunda.db.username}") private String jdbcUsername; @Value("${camunda.db.password}") private String jdbcPassword; @Value("${camunda.db.driver}") private String jdbcDriver; public MyCamundaProcessEngineConfiguration() { // 没有camunda表时自动建表 super.databaseSchemaUpdate = "true"; } @Override protected void initDataSource() { super.jdbcDriver = jdbcDriver; super.jdbcUrl = jdbcUrl; super.jdbcUsername = jdbcUsername; super.jdbcPassword = jdbcPassword; super.initDataSource(); } }
在使用camunda过程中难免使用监听器
package com.example.workflow; import org.camunda.bpm.engine.delegate.DelegateExecution; import org.camunda.bpm.engine.delegate.DelegateTask; import org.camunda.bpm.engine.delegate.ExecutionListener; import org.camunda.bpm.engine.delegate.TaskListener; import org.camunda.bpm.engine.task.IdentityLink; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.client.RestTemplate; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class MyProcessListener implements ExecutionListener, TaskListener { private static RestTemplate restTemplate; /** * @Author * @Description 这里将RestTemplate设置为静态变量并且通过setter方式注入是因为在低版本的camunda中,监听器是多实例的 * 在启动时会注入,但是在执行时,却发现实例为空,因此使用setter注入,同时使用静态变量保存注入实例 * @Date 19:47 2022/4/9 * @Param [restTemplate] * @return void **/ @Autowired public void setRestTemplate(RestTemplate restTemplate) { this.restTemplate = restTemplate; } /** * @Author * @Description 流程执行监听器 * @Date 19:32 2022/4/9 * @Param [delegateExecution] * @return void **/ @Override public void notify(DelegateExecution delegateExecution) throws Exception { // 事件名称 String eventName = delegateExecution.getEventName(); // 流程实例ID String processInstanceId = delegateExecution.getProcessInstanceId(); // 获取过程变量 Map<String, Object> variables = delegateExecution.getVariables(); switch (eventName) { case EVENTNAME_START: System.out.println("流程启动事件"); default: System.out.println("流程结束事件"); } } /** * @Author 赵迎旭 * @Description 节点监听器 * @Date 19:33 2022/4/9 * @Param [delegateTask] * @return void **/ @Override public void notify(DelegateTask delegateTask) { // 节点事件名称 String eventName = delegateTask.getEventName(); // 当前节点的名称 String currentActivityName = delegateTask.getExecution().getCurrentActivityName(); // 节点执行人 String assignee = delegateTask.getAssignee(); // 获取所有的可处理人(都有谁可以处理,但在处理前需要先指派任务给人) List<String> collect = delegateTask.getCandidates().stream().map(IdentityLink::getGroupId).collect(Collectors.toList()); switch (eventName) { case EVENTNAME_CREATE: System.out.println("节点创建事件"); case EVENTNAME_ASSIGNMENT: System.out.println("节点分派事件"); case EVENTNAME_COMPLETE: System.out.println("节点完成事件"); case EVENTNAME_UPDATE: System.out.println("节点删除事件"); case EVENTNAME_DELETE: System.out.println("节点删除事件"); default: System.out.println("节点超时事件"); } } }