SpringBoot整合activit7记录

Activiti7+Springboot使用整合记录====冰子杍

  • 底部有源码地址。
  • 在用源码前,自己敲了遍,发现:
  • 1、# activit7生成表 url后加 &nullCatalogMeansCurrent=true
  • 2、如果.bpmn改xml有中文乱码,(去设置中编译器=》文本编码,都设置成utf-8)
  • 3、actiBpm插件,在idea直接找不到,官网下actiBPM,下了后一个jar包,通过下面的方式引入就可以了
    -

0.Springboot项目创建

通过start.spring.io/生成纯净的一个spri…

1.引入Activiti相关依赖

<dependency>
    <groupId>org.activiti</groupId>
    <artifactId>activiti-spring-boot-starter</artifactId>
    <version>7.1.0.M6</version>
</dependency>
复制代码

2.启动工程并创建activiti数据库

  1. ##activiti7中使用spring security,因此启动工程前,需要加入2个文件支持,2个文件的代码如下:
package cn.gzsendi.activitidemotest.config;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

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;

@Configuration
public class ActivitiConfiguration {

<span class="hljs-keyword">private</span> Logger logger = LoggerFactory.getLogger(ActivitiConfiguration.class);

@Bean(name = <span class="hljs-string">"userDetailsService"</span>)
<span class="hljs-function"><span class="hljs-keyword">public</span> UserDetailsService <span class="hljs-title">myUserDetailsService</span><span class="hljs-params">()</span> </span>{

    InMemoryUserDetailsManager inMemoryUserDetailsManager = <span class="hljs-keyword">new</span> InMemoryUserDetailsManager();

    <span class="hljs-comment">//用户</span>
    String[][] usersGroupsAndRoles = {
            {<span class="hljs-string">"hefy"</span>, <span class="hljs-string">"123456"</span>, <span class="hljs-string">"ROLE_ACTIVITI_USER"</span>},
            {<span class="hljs-string">"liujh"</span>, <span class="hljs-string">"123456"</span>, <span class="hljs-string">"ROLE_ACTIVITI_ADMIN"</span>},
            {<span class="hljs-string">"liuky"</span>, <span class="hljs-string">"123456"</span>, <span class="hljs-string">"ROLE_ACTIVITI_USER"</span>},
            {<span class="hljs-string">"admin"</span>, <span class="hljs-string">"123456"</span>, <span class="hljs-string">"ROLE_ACTIVITI_ADMIN"</span>},
    };

    <span class="hljs-keyword">for</span> (String[] user : usersGroupsAndRoles) {
        List&lt;String&gt; authoritiesStrings = Arrays.asList(Arrays.copyOfRange(user, <span class="hljs-number">2</span>, user.length));
        logger.info(<span class="hljs-string">"&gt; Registering new user: "</span> + user[<span class="hljs-number">0</span>] + <span class="hljs-string">" with the following Authorities["</span> + authoritiesStrings + <span class="hljs-string">"]"</span>);
        inMemoryUserDetailsManager.createUser(<span class="hljs-keyword">new</span> User(user[<span class="hljs-number">0</span>], passwordEncoder().encode(user[<span class="hljs-number">1</span>]),
                authoritiesStrings.stream().<span class="hljs-built_in">map</span>(s -&gt; <span class="hljs-keyword">new</span> SimpleGrantedAuthority(s)).collect(Collectors.toList())));
    }

    <span class="hljs-keyword">return</span> inMemoryUserDetailsManager;

}

@<span class="hljs-function">Bean
<span class="hljs-keyword">public</span> PasswordEncoder <span class="hljs-title">passwordEncoder</span><span class="hljs-params">()</span> </span>{
    <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> BCryptPasswordEncoder();
}

}

复制代码

package cn.gzsendi.activitidemotest.utils;

import java.util.Collection;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
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 javax.annotation.Resource;

@Component
public class SecurityUtil {
	
	@Autowired
    @Qualifier("userDetailsService")
    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);
    }

}

复制代码
  1. ##加入activiti7的配置
server.port=8080
server.servlet.context-path=/activitidemotest

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/activitidemo?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&allowMultiQueries=true
spring.datasource.username=root
spring.datasource.password=123456

spring.activiti.database-schema-update=true
spring.activiti.db-history-used=true
spring.activiti.history-level=full
spring.activiti.check-process-definitions=false
spring.activiti.deployment-mode=never-fail
spring.activiti.process-definition-location-prefix=classpath:/process/
复制代码

  1. ##启动springboot工程,让系统启动时帮我们建好25张表

2.安装Activiti插件(设计器)

  1. ##Idea

file->settings->plugins,然后找actiBPM进行安装。

在这里插入图片描述 2. ##流程图中乱码问题先提前设置防止:

修改idea64.exe.vmoptions文件,在文件中加上如下,然后重启Idea

-Dfile.encoding=utf-8
复制代码
  1. ##进行流程设计

File->new->BpmnFile

在这里插入图片描述 在这里插入图片描述

设计好后,修改Process1.bpmn成Process1.xml,然后右键export file导出成Process1.png,再将Process1.bpmn修改成Process1.bpmn20.xml,最后将2个文件放在process文件夹 在这里插入图片描述

3.流程部署

使用activiti提供的api把流程定义内容存储起来,Activiti执行把流程定义内容存储在数据库中。

package cn.gzsendi.activitidemotest;

/**

  • Created by jxlhl on 2021/8/18.
    */

import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.DeploymentBuilder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootJunitTest {

<span class="hljs-comment">//得到RepositoryService实例</span>
@Autowired
<span class="hljs-keyword">private</span> RepositoryService repositoryService;

<span class="hljs-comment">//0.流程部署,单个文件部署方式</span>
@<span class="hljs-function">Test
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">testDeployment</span><span class="hljs-params">()</span></span>{

    <span class="hljs-comment">//使用RepositoryService进行部署</span>
    DeploymentBuilder builder = repositoryService.createDeployment();
    builder.addClasspathResource(<span class="hljs-string">"process/Process1.bpmn20.xml"</span>);
    builder.addClasspathResource(<span class="hljs-string">"process/Process1.png"</span>);
    builder.name(<span class="hljs-string">"first_activiti_process"</span>);
    Deployment deployment = builder.deploy();

    <span class="hljs-comment">//输出部署信息</span>
    System.out.println(<span class="hljs-string">"流程部署id:"</span> + deployment.getId());
    System.out.println(<span class="hljs-string">"流程部署名称:"</span> + deployment.getName());

    <span class="hljs-comment">//流程部署id:125098e1-ffd9-11eb-8847-02004c4f4f50</span>
    <span class="hljs-comment">//流程部署名称:first_activiti_process</span>

}

}
复制代码

执行此操作后activiti会将上边代码中指定的bpmn20文件和图片文件保存在activiti数据库。

流程定义部署后操作activiti的3张表

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

4.流程实例启动

启动一个流程实例表示开始一次业务流程的运行

    //1.流程实例启动
    @Test
    public void testStartProcess(){
        //根据流程定义Id启动流程
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_1");
    <span class="hljs-comment">//输出实例信息</span>
    System.out.println(<span class="hljs-string">"流程定义id:"</span> + processInstance.getProcessDefinitionId());
    System.out.println(<span class="hljs-string">"流程实例id:"</span> + processInstance.getId());
    System.out.println(<span class="hljs-string">"当前活动Id:"</span> + processInstance.getActivityId());

    <span class="hljs-comment">//流程定义id:myProcess_1:1:12702ed4-ffd9-11eb-8847-02004c4f4f50</span>
    <span class="hljs-comment">//流程实例id:a9b162aa-ffda-11eb-bad1-02004c4f4f50</span>
    <span class="hljs-comment">//当前活动Id:null</span>

}

复制代码

流程实例启动,将操作以下几个数据库表

act_hi_actinst 流程实例执行历史
act_hi_identitylink 流程的参与用户历史信息
act_hi_procinst 流程实例历史信息
act_hi_taskinst 流程任务历史信息
act_ru_execution 流程执行信息
act_ru_identitylink 流程的参与用户信息
act_ru_task 任务信息
复制代码

5.任务查询

流程启动后,任务的负责人就可以查询自己当前需要处理的任务,查询出来的任务都是该用户的待办任务。

    //2.任务查询
    //流程启动后,任务的负责人就可以查询自己当前需要处理的任务,查询出来的任务都是该用户的待办任务。
    @Test
    public void testFindPersonalTaskList() {
        //任务负责人
        String assignee = "liuky";
    <span class="hljs-comment">//根据流程key 和 任务负责人 查询任务</span>
    List&lt;Task&gt; <span class="hljs-built_in">list</span> = taskService.createTaskQuery()
            .processDefinitionKey(<span class="hljs-string">"myProcess_1"</span>)
            .taskAssignee(assignee)
            .<span class="hljs-built_in">list</span>();

    <span class="hljs-keyword">for</span> (Task task : <span class="hljs-built_in">list</span>) {

        System.out.println(<span class="hljs-string">"流程实例id:"</span> + task.getProcessInstanceId());
        System.out.println(<span class="hljs-string">"任务id:"</span> + task.getId());
        System.out.println(<span class="hljs-string">"任务负责人:"</span> + task.getAssignee());
        System.out.println(<span class="hljs-string">"任务名称:"</span> + task.getName());

    }

    <span class="hljs-comment">//流程实例id:a9b162aa-ffda-11eb-bad1-02004c4f4f50</span>
    <span class="hljs-comment">//任务id:a9b5815e-ffda-11eb-bad1-02004c4f4f50</span>
    <span class="hljs-comment">//任务负责人:liuky</span>
    <span class="hljs-comment">//任务名称:提交申请</span>

}

复制代码

6. 完成任务

    @Test
    public void completTask(){
    <span class="hljs-comment">//根据流程key和任务的负责人查询任务并选择其中的一个任务处理,这里用的</span>
    <span class="hljs-comment">//是singleResult返回一条,真实环境中是通过步骤5中查询出所有的任务,然后在页面上选择一个任务进行处理.</span>
    Task task = taskService.createTaskQuery()
            .processDefinitionKey(<span class="hljs-string">"myProcess_1"</span>) <span class="hljs-comment">//流程Key</span>
            .taskAssignee(<span class="hljs-string">"liuky"</span>)  <span class="hljs-comment">//要查询的负责人</span>
            .singleResult();
            
    <span class="hljs-comment">//完成任务,参数:任务id</span>
    taskService.complete(task.getId());

}

复制代码

7.流程结束,或流程流转过程中的历史信息查询

    //流程结束,或流程流转过程中的历史信息查询
    @Test
    public void findHistoryInfo(){
    <span class="hljs-comment">//获取 actinst表的查询对象</span>
    HistoricActivityInstanceQuery instanceQuery = historyService.createHistoricActivityInstanceQuery();
    <span class="hljs-comment">//查询 actinst表,条件:根据 InstanceId 查询</span>
    instanceQuery.processInstanceId(<span class="hljs-string">"fb5b7674-ffde-11eb-91f8-02004c4f4f50"</span>);
    <span class="hljs-comment">//增加排序操作,orderByHistoricActivityInstanceStartTime 根据开始时间排序 asc 升序</span>
    instanceQuery.orderByHistoricActivityInstanceStartTime().asc();
    <span class="hljs-comment">//查询所有内容</span>
    List&lt;HistoricActivityInstance&gt; activityInstanceList = instanceQuery.<span class="hljs-built_in">list</span>();
    <span class="hljs-comment">//输出结果</span>
    <span class="hljs-keyword">for</span> (HistoricActivityInstance hi : activityInstanceList) {

        System.out.println(<span class="hljs-string">""</span>);
        System.out.println(<span class="hljs-string">"===================-==============="</span>);
        System.out.println(hi.getStartTime());
        System.out.println(hi.getAssignee());
        System.out.println(hi.getActivityId());
        System.out.println(hi.getActivityName());
        System.out.println(hi.getProcessDefinitionId());
        System.out.println(hi.getProcessInstanceId());
        System.out.println(<span class="hljs-string">"===================-==============="</span>);
        System.out.println(<span class="hljs-string">""</span>);

    }
}

复制代码

8.其他Api测试

8.1 流程定义信息查询

查询流程相关信息,包含流程定义,流程部署,流程定义版本

    @Test
    public void queryProcessDefinition(){
    <span class="hljs-comment">//得到ProcessDefinitionQuery对象</span>
    ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();

    <span class="hljs-comment">//查询出当前所有的流程定义</span>
    List&lt;ProcessDefinition&gt; definitionList = processDefinitionQuery.processDefinitionKey(<span class="hljs-string">"myProcess_1"</span>)
            .orderByProcessDefinitionVersion()
            .desc()
            .<span class="hljs-built_in">list</span>();

    <span class="hljs-comment">//打印结果</span>
    <span class="hljs-keyword">for</span> (ProcessDefinition processDefinition : definitionList) {
        System.out.println(<span class="hljs-string">"流程定义 id="</span>+processDefinition.getId());
        System.out.println(<span class="hljs-string">"流程定义 name="</span>+processDefinition.getName());
        System.out.println(<span class="hljs-string">"流程定义 key="</span>+processDefinition.getKey());
        System.out.println(<span class="hljs-string">"流程定义 Version="</span>+processDefinition.getVersion());
        System.out.println(<span class="hljs-string">"流程部署ID ="</span>+processDefinition.getDeploymentId());
    }

}

复制代码

8.2 删除流程

    //删除流程
    @Test
    public void deleteDeployment(){
    String deploymentId = <span class="hljs-string">"125098e1-ffd9-11eb-8847-02004c4f4f50"</span>;

    <span class="hljs-comment">//删除流程定义,如果该流程定义已有流程实例启动则删除时出错</span>
    repositoryService.deleteDeployment(deploymentId);

    <span class="hljs-comment">//设置true 级联删除流程定义,即使该流程有流程实例启动也可以删除,设置为false非级别删除方式,如果流程</span>
    <span class="hljs-comment">//repositoryService.deleteDeployment(deploymentId, true);</span>

}

复制代码

9.demo源码下载

github: https://github.com/jxlhljh/activitidemotest.git
gitee: https://gitee.com/jxlhljh/activitidemotest.git
复制代码
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值