java工作流引擎開發activiti,activiti7和SpringBoot的整合

 2023-12-06 阅读 33 评论 0

摘要:Activiti7發布正式版本之后,它和SpringBoot2.x已經完全整合開發了 1.1 添加相關的依賴 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency&

Activiti7發布正式版本之后,它和SpringBoot2.x已經完全整合開發了

1.1 添加相關的依賴

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.activiti</groupId><artifactId>activiti-spring-boot-starter</artifactId><version>7.0.0.Beta2</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>

1.2 修改配置文件

# 配置Spring的數據源
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql:///activiti?characterEncoding=utf-8&amp;nullCatalogMeansCurrent=true&amp;serverTimezone=UTC
spring.datasource.name=root
spring.datasource.password=123456# activiti的配置
#1.flase:默認值。activiti在啟動時,對比數據庫表中保存的版本,如果沒有表或者版本不匹配,將拋出異常
#2.true: activiti會對數據庫中所有表進行更新操作。如果表不存在,則自動創建
#3.create_drop: 在activiti啟動時創建表,在關閉時刪除表(必須手動關閉引擎,才能刪除表)
#4.drop-create: 在activiti啟動時刪除原來的舊表,然后在創建新表(不需要手動關閉引擎)
spring.activiti.database-schema-update=true
# 檢測歷史表是否存在, Activiti7中默認是沒有開啟數據庫歷史記錄的,啟動數據庫歷史記錄
spring.activiti.db-history-used=true
#記錄歷史等級 可配置的歷史級別有none, activity, audit, full
#none:不保存任何的歷史數據,因此,在流程執行過程中,這是最高效的。
#activity:級別高于none,保存流程實例與流程行為,其他數據不保存。
#audit:除activity級別會保存的數據外,還會保存全部的流程任務及其屬性。audit為history的默認值。
#full:保存歷史數據的最高級別,除了會保存audit級別的數據外,還會保存其他全部流程相關的細節數據,包括一些流程參數等。
spring.activiti.history-level=full
# 校驗流程文件,默認校驗resouces下的 process 文件夾里的流程文件
spring.activiti.check-process-definitions=false

1.3 整合SpringSecurity

因為Activiti7和SpringBoot整合后,默認情況下,集成了SpringSecurity安全框架,這樣我們就要準備SpringSecurity的相關配置信息

java工作流引擎開發activiti、添加一個SpringSecurity的工具類

package com.lujunfeng.utils;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.context.SecurityContextImpl;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.stereotype.Component;import java.util.Collection;@Component
public class SecurityUtil {private Logger logger = LoggerFactory.getLogger(SecurityUtil.class);@Autowired@Qualifier("myUserDetailsService")private UserDetailsService userDetailsService;public void logInAs(String username) {UserDetails user = userDetailsService.loadUserByUsername(username);if (user == null) {throw new IllegalStateException("User " + username + " doesn't exist, please provide a valid user");}logger.info("> Logged in as: " + username);SecurityContextHolder.setContext(new SecurityContextImpl(new Authentication() {@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {return user.getAuthorities();}@Overridepublic Object getCredentials() {return user.getPassword();}@Overridepublic Object getDetails() {return user;}@Overridepublic Object getPrincipal() {return user;}@Overridepublic boolean isAuthenticated() {return true;}@Overridepublic void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException {}@Overridepublic String getName() {return user.getUsername();}}));org.activiti.engine.impl.identity.Authentication.setAuthenticatedUserId(username);}
}

這個類可以從Activiti7官方提供的Example中找到。

添加一個SpringSecurity的配置文件

package com.lujunfeng.config;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@Configuration
public class SpringSecurityConfiguration {private Logger logger = LoggerFactory.getLogger(SpringSecurityConfiguration.class);@Beanpublic UserDetailsService myUserDetailsService() {InMemoryUserDetailsManager inMemoryUserDetailsManager = new InMemoryUserDetailsManager();//這里添加用戶,后面處理流程時用到的任務負責人,需要添加在這里String[][] usersGroupsAndRoles = {{"jack", "password", "ROLE_ACTIVITI_USER", "GROUP_activitiTeam"},{"rose", "password", "ROLE_ACTIVITI_USER", "GROUP_activitiTeam"},{"tom", "password", "ROLE_ACTIVITI_USER", "GROUP_activitiTeam"},{"other", "password", "ROLE_ACTIVITI_USER", "GROUP_otherTeam"},{"system", "password", "ROLE_ACTIVITI_USER"},{"admin", "password", "ROLE_ACTIVITI_ADMIN"},};for (String[] user : usersGroupsAndRoles) {List<String> authoritiesStrings = Arrays.asList(Arrays.copyOfRange(user, 2, user.length));logger.info("> Registering new user: " + user[0] + " with the following Authorities[" + authoritiesStrings + "]");inMemoryUserDetailsManager.createUser(new User(user[0], passwordEncoder().encode(user[1]),authoritiesStrings.stream().map(s -> new SimpleGrantedAuthority(s)).collect(Collectors.toList())));}return inMemoryUserDetailsManager;}@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}
}

2.4 創建bpmn文件

activiti7開發指南、創建一個簡單的bpmn文件,并設置任務的用戶組,CandidateGroups,CandidateGroups中的內容要與在SpringSecurity的配置文件中配置的用戶組的名稱要保持一致,可以填寫activitTeam或者otherTeam。這樣填寫的好處是,當不確定到底由誰來負責當前的任務的時候,只要是Groups內的用戶都可以拾取這個任務

Activiti7中可以自動部署流程,前提是在resources目錄下,創建一個新的目錄processes,用來放置bpmn文件

vue activiti、

1.5 單元測試

package com.lujunfeng;import com.lujunfeng.utils.SecurityUtil;
import org.activiti.api.process.model.ProcessDefinition;
import org.activiti.api.process.model.ProcessInstance;
import org.activiti.api.process.model.builders.ProcessPayloadBuilder;
import org.activiti.api.process.runtime.ProcessRuntime;
import org.activiti.api.runtime.shared.query.Page;
import org.activiti.api.runtime.shared.query.Pageable;
import org.activiti.api.task.model.Task;
import org.activiti.api.task.model.builders.ClaimTaskPayloadBuilder;
import org.activiti.api.task.model.builders.TaskPayloadBuilder;
import org.activiti.api.task.model.payloads.ClaimTaskPayload;
import org.activiti.api.task.runtime.TaskRuntime;
import org.activiti.engine.RepositoryService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class ActSpringbootApplicationTests {@Autowiredprivate ProcessRuntime processRuntime;@Autowiredprivate TaskRuntime taskRuntime;@Autowiredprivate SecurityUtil securityUtil;@Autowiredprivate RepositoryService repositoryService;@Testvoid contextLoads() {System.out.println(taskRuntime);}/*** 查詢流程的定義*/@Testpublic void test02(){securityUtil.logInAs("system");Page<ProcessDefinition> processDefinitionPage =processRuntime.processDefinitions(Pageable.of(0, 10));System.out.println("可用的流程定義數量:" + processDefinitionPage.getTotalItems());for (ProcessDefinition processDefinition : processDefinitionPage.getContent()) {System.out.println("流程定義:" + processDefinition);}}/*** 部署流程*/@Testpublic void test03(){repositoryService.createDeployment().addClasspathResource("processes/my-evection.bpmn").addClasspathResource("processes/my-evection.png").name("出差申請單").deploy();}/*** 啟動流程實例*/@Testpublic void test04(){securityUtil.logInAs("system");ProcessInstance processInstance = processRuntime.start(ProcessPayloadBuilder.start().withProcessDefinitionKey("my-evection").build());System.out.println("流程實例id:" + processInstance.getId());}/*** 任務查詢、拾取及完成操作*/@Testpublic void test05(){securityUtil.logInAs("jack");Page<Task> tasks = taskRuntime.tasks(Pageable.of(0, 10));if(tasks != null && tasks.getTotalItems() > 0){for (Task task : tasks.getContent()) {// 拾取任務taskRuntime.claim(TaskPayloadBuilder.claim().withTaskId(task.getId()).build());System.out.println("任務:" + task);taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(task.getId()).build());}}Page<Task> taskPage2 = taskRuntime.tasks(Pageable.of(0,10));if(taskPage2 .getTotalItems() > 0){System.out.println("任務:" + taskPage2.getContent());}}}

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/190484.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息