SpringBoot整合Activiti工作流框架的使用
Activiti 介紹
Activiti
是一個開源的工作流引擎,它實現瞭BPMN 2.0
規范,可以發佈設計好的流程定義,並通過api
進行流程調度。Activiti
作為一個遵從Apache
許可的工作流和業務流程管理開源平臺,其核心是基於Java
的超快速、超穩定的BPMN2.0
流程引擎,強調流程服務的可嵌入性和可擴展性,同時更加強調面向業務人員。- 簡單來說
activiti
是一個業務流程管理引擎,會沿著設計者設計好的流程,一步一步的執行下去,直到終點。
SpringBoot 整合
配置
activiti
會框架會創建一系列的表,所以要配置相關數據庫的信息,需要註意的是,在url
中,添加瞭針對數據庫的條件,其中最後一條nullCatalogMeansCurrent=true
非常重要,至於有什麼用就不概述瞭,但是沒有這條語句的話就無法自動創建對應的二十八張表。
server: port: 8014 spring: application: name: workflow datasource: name: mysqlDatasource url: jdbc:mysql://localhost:3306/core?useUnicode=true&nullCatalogMeansCurrent=true username: root password: root driver-class-name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource # 監控統計攔截的filters,如果啟用log4j記得添加依賴 filters: stat,wall # activiti activiti: #每次應用啟動不檢查Activiti數據表是否存在及版本號是否匹配,提升應用啟動速度 database-schema-update: true #在項目單獨作為一個引擎,本身不部署流程的時候,如果resources目錄沒有“processes”目錄,啟動項目報錯–找不到processes目錄。需要在配置文件中添加以下內容: check-process-definitions: false process-definition-location-prefix: classpath:/processes/ process-definition-location-suffixes: -**.bpmn -**.bpmn20.xml #保存歷史數據級別設置為full最高級別,便於歷史數據的追溯 history-level: full # activiti 安全訪問 security: basic: enabled: true user: name: root password: root
版本問題
- 註意
SpringBoot
和Activiti
的版本問題 springboot2.0
不能與activiti6.0.0
直接集成使用,因為activiti6.0.0
出來的時候springboot2.0
還沒有出來,activiti6.0.0
支持springboot1.2.6
以上,2.0.0
以下的版本。
使用 starter
依賴
這個版本滿足高版本的springboot
,直接使用就行
<dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter</artifactId> <version>7.1.0.M3.1</version> </dependency>
需要註意的是,這裡的依賴版本,需要對應數據庫中act_ge_property
表中schema.version
版本信息,所以一般不建議在創建完表之後修改依賴信息
啟動項目成功後自動創建表
需要在配置文件中加上 activiti-security
的配置
# activiti 安全訪問 security: basic: enabled: true user: name: root password: root
不使用 starter
依賴
<dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring</artifactId> <version>6.0.0</version> </dependency>
配置代碼
@Configuration public class ActivitiConfig { private static final Logger logger = LoggerFactory.getLogger(ActivitiConfig.class); /** * 配置分為以下幾步驟 * 1. 創建ActivitiConfig * 2. 使用ActivitiConfig創建ProcessEngineFactoryBean * 3. 使用ProcessEngineFactoryBean創建ProcessEngine對象 * 4. 使用ProcessEngine對象創建需要的服務對象 */ private final DataSource dataSource; private final PlatformTransactionManager platformTransactionManager; @Autowired public ActivitiConfig(DataSource dataSource, PlatformTransactionManager transactionManager) { this.dataSource = dataSource; platformTransactionManager = transactionManager; } /* * 1. 創建配置文件,也就是提供一些配置信息,這樣就可以自定義自己的創建信息瞭 * 需要一些參數,1. 數據源。2. 事務管理器。 * 這裡還加入瞭自動掃描process包下的bpmn(流程定義文件)的設置,這樣就可以省去瞭部署 * */ @Bean public SpringProcessEngineConfiguration springProcessEngineConfiguration() { SpringProcessEngineConfiguration spec = new SpringProcessEngineConfiguration(); spec.setDataSource(dataSource); spec.setTransactionManager(platformTransactionManager); spec.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE); Resource[] resources = null; // 啟動自動部署流程 try { resources = new PathMatchingResourcePatternResolver().getResources("classpath*:processes/*.*.xml"); } catch (IOException e) { logger.error("Error Occur:", e); } spec.setDeploymentResources(resources); return spec; } @Bean public ProcessEngineFactoryBean processEngine() { ProcessEngineFactoryBean engineFactoryBean = new ProcessEngineFactoryBean(); engineFactoryBean.setProcessEngineConfiguration(springProcessEngineConfiguration()); return engineFactoryBean; } @Bean public RepositoryService repositoryService() throws Exception { return Objects.requireNonNull(processEngine().getObject()).getRepositoryService(); } @Bean public RuntimeService runtimeService() throws Exception { return Objects.requireNonNull(processEngine().getObject()).getRuntimeService(); } @Bean public TaskService taskService() throws Exception { return Objects.requireNonNull(processEngine().getObject()).getTaskService(); } @Bean public HistoryService historyService() throws Exception { return Objects.requireNonNull(processEngine().getObject()).getHistoryService(); } }
在resources
中創建process
文件夾,文件夾的路徑和名字需要和ActivitiConfig
中的配置保持一致啟動springBoot
項目即可創建完成
使用 Activiti
Idea
安裝 Activiti BPMN visualizer
插件
編寫測試 bpmn.xml
<?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/processdef"> <process id="test" name="test" isExecutable="true"> <startEvent id="startevent1" name="Start"></startEvent> <endEvent id="endevent1" name="End"></endEvent> <userTask id="usertask1" name="HelloWorld" activiti:assignee="goxcheer"></userTask> <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow> <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="endevent1"></sequenceFlow> </process> <bpmndi:BPMNDiagram id="BPMNDiagram_test"> <bpmndi:BPMNPlane bpmnElement="test" id="BPMNPlane_test"> <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1"> <omgdc:Bounds height="35.0" width="41.0" x="220.0" y="180.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1"> <omgdc:Bounds height="35.0" width="35.0" x="640.0" y="180.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1"> <omgdc:Bounds height="55.0" width="105.0" x="390.0" y="170.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1"> <omgdi:waypoint x="261.0" y="197.0"></omgdi:waypoint> <omgdi:waypoint x="390.0" y="197.0"></omgdi:waypoint> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2"> <omgdi:waypoint x="495.0" y="197.0"></omgdi:waypoint> <omgdi:waypoint x="640.0" y="197.0"></omgdi:waypoint> </bpmndi:BPMNEdge> </bpmndi:BPMNPlane> </bpmndi:BPMNDiagram> </definitions>
編寫測試代碼
測試代碼
@RequestMapping("/test") @RestController public class ActivitiTestController { private static final Logger logger = LoggerFactory.getLogger(ActivitiTestController.class); @Autowired RuntimeService runtimeService; @Autowired private TaskService taskService; @RequestMapping("/test1") public void test1() { logger.info("Start........."); ProcessInstance pi = runtimeService.startProcessInstanceByKey("test"); logger.info("流程啟動成功,流程id:{}", pi.getId()); } @RequestMapping("/test2") public void test2() { String userId = "root"; List<Task> resultTask = taskService.createTaskQuery().processDefinitionKey("test").taskCandidateOrAssigned(userId).list(); logger.info("任務列表:{}", resultTask); } }
…簡單配置到此結束
完整配置代碼見 :https://gitee.com/Marlon_Brando/onlineshop_back/tree/develop/os_workflow
到此這篇關於SpringBoot整合Activiti工作流框架的使用的文章就介紹到這瞭,更多相關SpringBoot Activiti工作流內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 基於springboot的flowable工作流實戰流程分析
- spring boot隻需兩步優雅整合activiti示例解析
- 使用SpringBoot整合Activiti6工作流的操作方法
- Activiti7整合Springboot使用記錄
- Activiti工作流學習筆記之自動生成28張數據庫表的底層原理解析