💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
案例代码:https://gitee.com/flymini/codes01/tree/master/activiti_/learn-activiti04 **** 整合步骤如下: **1. 创建一个SpringBoot项目,`pom.xml`如下** ```xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.0.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </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> <version>5.1.49</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.18</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> ``` **2. `resources/application.yml`** ```yml spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost/activiti?useUnicode=true&amp;characterEncoding=UTF-8 username: root password: root activiti: #数据库策略 #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常(生产环境常用) #2.true:activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建(开发时常用) #3.create_drop:在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表) #4.drop-create:在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎) database-schema-update: true #activiti7默认不生成历史信息表,开启历史表 db-history-used: true #记录历史等级 可配置的历史级别有none, activity, audit, full #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。 #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。 #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。 #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。 history-level: full ``` **3. 添加SpringSecurity安全框架整合配置** 因为Activiti7与SpringBoot整合后,默认情况下,集成了SpringSecurity安全框架,这样我们就要去准备SpringSecurity整合进来的相关用户权限配置信息。 (1)*`learn.activiti04.utils.SecurityUtil`* ```java /** * 为了能够快速实现SpringSecurity安全框架的配置,所添加的一个组件。 * 这个类可以从我们下载的Activiti7官方提供的Example中找到。 */ @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() { @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); } } ``` (2)*`learn.activiti04.config.CustomConfig`* ```java /** * 设置用户和角色 * 1)在Activiti7官方下载的Example中找到DemoApplicationConfig类, * 它的作用是为了实现SpringSecurity框架的用户权限的配置,这样我们就可以在系统中使用用户权限信息。 * 2)本次项目中基本是在文件中定义出来的用户信息,当然也可以是数据库中查询的用户权限信息。 * 3)后面处理流程时用到的任务负责人,需要添加在这里。 */ @Slf4j @Configuration public class CustomConfig { /** * 添加Security的用户 */ @Bean public UserDetailsService myUserDetailsService() { //把用户存储在内存中 InMemoryUserDetailsManager inMemoryUserDetailsManager = new InMemoryUserDetailsManager(); //构造用户的信息 String[][] usersGroupAndRoles = { {"jack", "password", "ROLE_ACTIVITI_USER", "GROUP_activitiTeam"}, {"rose", "password", "ROLE_ACTIVITI_USER", "GROUP_activitiTeam"}, {"tom", "password", "ROLE_ACTIVITI_USER", "GROUP_activitiTeam"}, {"jerry", "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[] users : usersGroupAndRoles) { //用户的角色和组 List<String> authStrList = Arrays.asList(Arrays.copyOfRange(users, 2, users.length)); log.info("> Registering new user: {} with the following Authorities[{}]", users[0], authStrList); inMemoryUserDetailsManager.createUser(new User(users[0], passwordEncoder().encode(users[1]), authStrList.stream().map(str -> new SimpleGrantedAuthority(str)).collect(Collectors.toList()))); } return inMemoryUserDetailsManager; } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } } ``` **4. 创建Bpmn文件** Activiti7可以自动部署流程,前提是在resources目录下,创建一个新的目录processes,用来放置bpmn文件。 <br/> 创建一个简单的Bpmn流程文件,并设置任务的用户组Candidate Groups。Candidate Groups中的内容与上面DemoApplicationConfiguration类中出现的用户组名称要保持一致,可以填写:`activitiTeam` 或者 `otherTeam`。 这样填写的好处:当不确定到底由谁来负责当前任务的时候,只要是Groups内的用户都可以拾取这个任务。 ![](https://img.kancloud.cn/bb/6d/bb6d77584b43f67fa97a7c4d09dce686_823x570.png) **5. 测试代码** ```java @Slf4j @RunWith(SpringRunner.class) @SpringBootTest public class TestActSpringBoot { @Autowired private ProcessRuntime processRuntime; @Autowired private TaskRuntime taskRuntime; @Autowired private SecurityUtil securityUtil; /** * 查看流程定义内容 * Activiti7可以自动部署流程 */ @Test public void findProcess() { //设置登录用户 securityUtil.logInAs("jack"); //流程定义的分页对象 Page<ProcessDefinition> definitionPage = processRuntime.processDefinitions(Pageable.of(0, 10)); System.out.println("可用的流程定义总数:" + definitionPage.getTotalItems()); //1 for (ProcessDefinition processDefinition : definitionPage.getContent()) { //ProcessDefinition{id='mydemo:1:ccad0c95-2a61-11ec-b839-5492dfcbba11', name='null', key='mydemo',... System.out.println("流程定义内容:" + processDefinition); System.out.println(); } } /** * 启动流程 */ @Test public void startProcess() { //设置登录用户 securityUtil.logInAs("system"); ProcessInstance processInstance = processRuntime. start(ProcessPayloadBuilder .start() .withProcessDefinitionKey("mydemo") //流程定义key .build()); log.info("流程实例的内容,{}", processInstance); } /** * 执行任务 */ @Test public void doTask() { //设置登录用户 securityUtil.logInAs("jerry"); //查询任务 Page<Task> taskPage = taskRuntime.tasks(Pageable.of(0, 10)); if (taskPage != null && taskPage.getTotalItems() > 0) { for (Task task : taskPage.getContent()) { //拾取任务 taskRuntime.claim(TaskPayloadBuilder .claim() .withTaskId(task.getId()) .build()); log.info("任务内容,{}", task); //完成任务 taskRuntime.complete(TaskPayloadBuilder .complete() .withTaskId(task.getId()) .build()); } } } } ```