1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 《Activiti/Flowable  深入BPM工作流》- Activiti 与springboot 怎么进行整合?

《Activiti/Flowable  深入BPM工作流》- Activiti 与springboot 怎么进行整合?

时间:2023-08-17 12:27:40

相关推荐

《Activiti/Flowable  深入BPM工作流》- Activiti 与springboot 怎么进行整合?

《Activiti/Flowable 深入BPM工作流》 -Activiti 与springboot 怎么进行整合?

一.问题

Activiti 如何与springboot进行整合?

1. 添加springboot整合 Activiti的坐标。

2. 添加springSecurity的安全框架的整合配置信息。

3. 使用Activiti新支持的类来实现工作流的开发

ProcessRuntimeService接口

TaskRuntimeService接口

4. 使用新的API实现工作流开发,主要包括

(1)流程定义查询

(2)启动流程实例。

(3)任务查询。

(4)任务完成。

二. 详情

1. 添加pom坐标依赖:

为了能够实现springboot与Activiti7 的整合开发,首先我们需要引入相关依赖的支持,所以我们在工作的pom.xml文件中引入相关依赖,具体的依赖如下:

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.0.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><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></dependency><dependency><groupId>org.activiti</groupId><artifactId>activiti-spring-boot-starter</artifactId><version>7.0.0.Beta2</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.5</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.27</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

通过pom.xml文件所导入的坐标依赖, 我们就可以实现activiti7 与springboot的有效整合。

2. 添加配置文件: application.yml

为了能够实现Activiti7 生成的表放到mysql 数据库中,需要在springboot的配置文件 application.yml 中添加相关配置。

spring:datasource:url:jdbc:mysql://localhost:3306/activiti?useUnicode=true&characterEncoding=utf8&serverTimezone=GMTusername : rootpassword : rootdriver-class-name: com.mysql.jdbc.Driver

3. 进行Java 的springboot和activiti的相关整合:

(1)添加 SecurityUtil类

为了能够快速实现 SpringSecurity 安全框架的配置,所添加的一个组件。

这个类可以从我们下载的 Activiti7 官方提供的 Example 中找到。

@Componentpublic 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) throwsIllegalArgumentException {}@Overridepublic String getName() { return user.getUsername();}}));org.activiti.engine.impl.identity.Authentication.setAuthenticatedUserId(username);}}

(2)添加DemoApplicationConfig类

在 Activiti7 官方下载的 Example 中找到 DemoApplicationConfig 类,它的作用是为了实现

SpringSecurity 框架的用户权限的配置,这样我们就可以在系统中使用用户权限信息。本次项目中基

本是在文件中定义出来的用户信息,当然也可以是数据库中查询的用户权限信息。

@Configurationpublic class DemoApplicationConfiguration {private Logger logger =LoggerFactory.getLogger(DemoApplicationConfiguration.class);@Beanpublic UserDetailsService myUserDetailsService() {InMemoryUserDetailsManager inMemoryUserDetailsManager = newInMemoryUserDetailsManager();String[][] usersGroupsAndRoles = {{"salaboy", "password", "ROLE_ACTIVITI_USER", "GROUP_activitiTeam"},{"ryandawsonuk", "password", "ROLE_ACTIVITI_USER", "GROUP_activitiTeam"},{"erdemedeiros", "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 followingAuthorities[" + authoritiesStrings + "]");inMemoryUserDetailsManager.createUser(new User(user[0],passwordEncoder().encode(user[1]),authoritiesStrings.stream().map(s -> newSimpleGrantedAuthority(s)).collect(Collectors.toList())));}return inMemoryUserDetailsManager;}@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}}

4. 整合效果的测试:

使用springboot整合Junit方式测试

@RunWith(SpringRunner.class)@SpringBootTestpublic class Actviti7DemoApplicationTests {@Autowiredprivate ProcessRuntime processRuntime;@Autowiredprivate TaskRuntime taskRuntime;@Autowiredprivate SecurityUtil securityUtil;}

/*** 查看流程定义*/@Testpublic void contextLoads() {securityUtil.logInAs("system");Page<ProcessDefinition> processDefinitionPage =processRuntime.processDefinitions(Pageable.of(0, 10));System.out.println(" 可 用 的 流 程 定 义 数 量 : " +processDefinitionPage.getTotalItems());for (org.activiti.api.process.model.ProcessDefinition pd :processDefinitionPage.getContent()) {System.out.println("流程定义:" + pd);}}

/*** 启动流程实例*/@Testpublic void testStartProcess() {securityUtil.logInAs("system");ProcessInstance pi =processRuntime.start(ProcessPayloadBuilder.start().withProcessDefinitionKey("myProcess").build());System.out.println("流程实例 ID:" + pi.getId());}

/*** 查询任务,并完成自己的任务*/@Testpublic void testTask() {securityUtil.logInAs("ryandawsonuk");Page<Task> taskPage=taskRuntime.tasks(Pageable.of(0,10));if (taskPage.getTotalItems()>0){for (Task task:taskPage.getContent()){taskRuntime.claim(TaskPayloadBuilder.claim().withTaskId(task.getId()).build());System.out.println(" 任务:"+task);plete(plete().withTaskId(task.getId()).build());}}Page<Task> taskPage2=taskRuntime.tasks(Pageable.of(0,10));if (taskPage2.getTotalItems()>0){System.out.println(" 任务:"+taskPage2.getContent());}}

三. 小结

使用TaskRuntime接口的task()方法实现任务的查询

使用TaskRuntime接口的claim()方法实现任务拾取

使用TaskRunTime接口complete()方法实现任务完成。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。