Activity7学习5—整合SpringBoot
文章目录
引入pom文件坐标
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <slf4j.version>1.6.6</slf4j.version> <log4j.version>1.2.12</log4j.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</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.40</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
添加SpringSecurity的相关配置类以及启动类
由于activity7和SpringSecurity是强耦合的所以在使用activity7进行web开发时要注意添加SecurityUtil 和DemoApplicationConfiguration 两个工具类,这两个类可以在官方提供的案例中找到,activity官网地址
@Componentpublic class SecurityUtil { @Autowired 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"); } SecurityContextHolder.setContext(new SecurityContextImpl(new Authentication() { @Override public Collection<? extends GrantedAuthority> getAuthorities() { return user.getAuthorities(); } @Override public Object getCredentials() { return user.getPassword(); } @Override public Object getDetails() { return user; } @Override public Object getPrincipal() { return user; } @Override public boolean isAuthenticated() { return true; } @Override public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException { } @Override public String getName() { return user.getUsername(); } })); org.activiti.engine.impl.identity.Authentication.setAuthenticatedUserId(username); }}
@Configuration@EnableWebSecuritypublic class DemoApplicationConfiguration extends WebSecurityConfigurerAdapter { private Logger logger = LoggerFactory.getLogger(DemoApplicationConfiguration.class); @Override @Autowired public void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(myUserDetailsService()); } @Bean public UserDetailsService myUserDetailsService() { InMemoryUserDetailsManager inMemoryUserDetailsManager = new InMemoryUserDetailsManager(); 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"}, {"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; } @Override protected void configure(HttpSecurity http) throws Exception { http .csrf().disable() .authorizeRequests() .anyRequest() .authenticated() .and() .httpBasic(); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); }}
@SpringBootApplicationpublic class ActivitiDemoApplication { public static void main(String[] args) { SpringApplication.run(ActivitiDemoApplication.class,args); }}
编写配置文件application.yml
spring: datasource: url: jdbc:mysql://localhost:3306/activitydb?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT username : root password : 123 driver-class-name: com.mysql.jdbc.Driver activiti: db-history-used: true
定义一个流程用于测试
注意candidate Groups必须得按照DemoApplicationConfiguration的规则设置,不然进行查询taskRuntime.tasks查不出数据。
编写测试类
查看流程定义信息
@RunWith(SpringRunner.class)@SpringBootTestpublic class ActivitiTest { @Autowired private ProcessRuntime processRuntime;//实现流程定义相关操作 @Autowired private TaskRuntime taskRuntime;//任务操作相关类 @Autowired private SecurityUtil securityUtil;//springSecurity相关工具类 /** * 流程定义信息的查看 * 注意:activity7和SpringBoot整合后,会自动部署resources/processes/*.bpmn */ @Test public void testDefinition(){ //屏蔽AuthenticationCredentialsNotFoundException报错 securityUtil.logInAs("salaboy");//springSecurity的认证工作 //分页查询出流程定义信息 Page processDefinitionPage = processRuntime.processDefinitions (Pageable.of(0, 10)); System.out.println("已部署流程个数:"+processDefinitionPage.getTotalItems()); //得到当前部署的每个流程的定义信息 for (Object pd : processDefinitionPage.getContent()){ System.out.println(pd); } }}
查询并完成任务
@Test public void testTask(){ securityUtil.logInAs("salaboy"); Page<Task> taskPage = taskRuntime.tasks(Pageable.of(0, 10)); if(taskPage.getTotalItems()>0){ //说明有任务 for(Task task : taskPage.getContent()){ System.out.println("任务:"+task); //拾取任务 candidate="activitiTeam" Task claim = taskRuntime.claim(TaskPayloadBuilder .claim() .withTaskId(task.getId()) .build()); //执行任务 taskRuntime.complete(TaskPayloadBuilder. complete(). withTaskId(task.getId()). build()); System.out.println(task.getId()+"执行完成"); } } }
总结
至此: 免费的Activity课程.就学完了。Activity是一个很好的工作流框架,虽然很老了,但其思想还是很值得学习的,主要是新的工作流引擎我没找到白嫖的课程。最后附上我学习时写的代码地址,希望可以帮助大家,如果可以给个关注谢谢!