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("節點超時事件"); } } }