SpringBoot中引入Activiti并完成基本业务流程

2021-03-07 05:27

阅读:534

标签:处理   概述   XML   base   管理器   connect   roo   标识   对象   

Activiti

DB中各个表的作用

Activiti的后台是有数据库的支持,所有的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。 用途也和服务的API对应。
ACT_RE_*: ‘RE‘表示repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。
ACT_RU_*: ‘RU‘表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
ACT_ID_*: ‘ID‘表示identity。 这些表包含身份信息,比如用户,组等等。
ACT_HI_*: ‘HI‘表示history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。
ACT_GE_*: 通用数据, 用于不同场景下,如存放资源文件。

两种整合方式

不使用SpringBootStarter

依赖
    org.activiti
        activiti-spring
        6.0.0
数据源
server:
  port: 80

spring:
  datasource:
    url: jdbc:mysql://121.41.224.124:3307/activiti1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC&nullCatalogMeansCurrent=true&autoReconnect=true
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: 123


  activiti:
    database-schema-update: true
    check-process-definitions: true
    process-definition-location-prefix: classpath:/processes/
    #    process-definition-location-suffixes:
    #      - **.bpmn
    #      - **.bpmn20.xml
    history-level: full

需要注意的是,在url中,添加了针对数据库的条件,其中最后一条nullCatalogMeansCurrent=true非常重要,至于有什么用就不概述了,但是没有这条语句的话就无法自动创建对应的二十八张表

配置
@Configuration
public class ActivitiConfig {
    /*
    * 配置分为以下几步骤
    * 1. 创建ActivitiConfig
    * 2. 使用ActivitiConfig创建ProcessEngineFactoryBean
    * 3. 使用ProcessEngineFactoryBean创建ProcessEngine对象
    * 4. 使用ProcessEngine对象创建需要的服务对象
    * */
    private Logger logger = LoggerFactory.getLogger(ActivitiConfig.class);

    private final DataSource dataSource;

    private final PlatformTransactionManager platformTransactionManager;
    @Autowired
    public ActivitiConfig(DataSource dataSource, PlatformTransactionManager platformTransactionManager) {
        this.dataSource = dataSource;
        this.platformTransactionManager = platformTransactionManager;
    }
/*
* 1. 创建配置文件,也就是提供一些配置信息,这样就可以自定义自己的创建信息了
* 需要一些参数,1. 数据源。2. 事务管理器。
* 这里还加入了自动扫描process包下的bpmn(流程定义文件)的设置,这样就可以省去了部署
 * */
    @Bean
    public SpringProcessEngineConfiguration springProcessEngineConfiguration() {
        SpringProcessEngineConfiguration spec = new SpringProcessEngineConfiguration();
        spec.setDataSource(dataSource);
        spec.setTransactionManager(platformTransactionManager);
        spec.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
        Resource[] resources = null;
        // 启动自动部署流程
        try {
            resources = new PathMatchingResourcePatternResolver().getResources("classpath*:process/*.bpmn");
        } catch (IOException e) {
            e.printStackTrace();
        }
        spec.setDeploymentResources(resources);
        return spec;
    }

    @Bean
    public ProcessEngineFactoryBean processEngine() {
        ProcessEngineFactoryBean processEngineFactoryBean = new ProcessEngineFactoryBean();
        processEngineFactoryBean.setProcessEngineConfiguration(springProcessEngineConfiguration());
        return processEngineFactoryBean;
    }

    @Bean
    public RepositoryService repositoryService() throws Exception {
        return processEngine().getObject().getRepositoryService();
    }

    @Bean
    public RuntimeService runtimeService() throws Exception {
        return processEngine().getObject().getRuntimeService();
    }

    @Bean
    public TaskService taskService() throws Exception {
        return processEngine().getObject().getTaskService();
    }

    @Bean
    public HistoryService historyService() throws Exception {
        return processEngine().getObject().getHistoryService();
    }
}

使用Starter

依赖
    org.activiti
        activiti-spring-boot-starter
        7.1.0.M3.1

需要注意的是,这里的依赖版本,需要对应数据库中act_ge_property表中schema.version版本信息,所以一般不建议在创建完表之后修改依赖信息

application.propertie
spring.activiti.database-schema-update=true
spring.activiti.process-definition-location-prefix=classpath:/process/
# 这里还是记得注意最后面添加url时添加的语句

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/activiti?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC&nullCatalogMeansCurrent=true
spring.datasource.username=root
spring.datasource.password=root

从BPMN文件读取一个工作流

    @Autowired
    RepositoryService repositoryService;

    @Autowired
    TaskService taskService;
    
    @Test
    public void deploy() {
        //获取仓库服务 :管理流程定义
        RepositoryService repositoryService = processEngine.getRepositoryService();
        Deployment deploy = repositoryService.createDeployment()//创建一个部署的构建器
                .addClasspathResource("XXXXXXXX/LeaveActiviti.bpmn")//从类路径中添加资源,一次只能添加一个资源
                .name("请求单流程")//设置部署的名称
                .category("办公类别")//设置部署的类别
                .deploy();

        System.out.println("部署的id"+deploy.getId());
        System.out.println("部署的名称"+deploy.getName());
    }

运行一个工作流

    @Autowired
    RuntimeService runtimeService;
    
    /**
     * 运行一个工作流
     */
    @Test
    void startProcess() {
        //指定执行我们刚才部署的工作流程
        String processDefKey = "leave";
        //取运行时服务
        if (runtimeService != null) log.error("Engine Success");
        //取得流程实例
        ProcessInstance instance = runtimeService.startProcessInstanceById("PROCESS_1:1:7504");
        System.out.println("流程实例id:"+instance.getId());//流程实例id
        System.out.println("流程定义id:"+instance.getProcessDefinitionId());//输出流程定义的id
    }
    
运行结果:
2021-01-14 09:57:45.303 ERROR 6882 --- [           main] com.codedef.ActivitiApplicationTests     : Engine Success
流程实例id:10001
流程定义id:PROCESS_1:1:7504

查询所有待办

/**
     * 查询待办
     */
    @Test
    void getTaskList() {
        List tasks = taskService.createTaskQuery().list();
        log.info("tasks len: " + tasks.size());
        tasks.stream().forEach(e -> {
            System.out.println(e);
        });
    }

运行结果:
2021-01-14 10:23:00.962  INFO 8496 --- [           main] com.codedef.ActivitiApplicationTests     : tasks len: 1
Task[id=15005, name=提交申请]

查询某个人的待办

/**
     * 根据代理人查询当前任务的信息
     */
    @Test
    void getTaskByAssignee() {
        String assignee;
        List list;
        //创建一个任务查询对象
        TaskQuery taskQuery = taskService.createTaskQuery();


        //任务的办理人
        assignee = "老大";
        log.info("老大的任务:");
        list = taskQuery.taskAssignee(assignee).list();
        list.stream().forEach(e -> {
            System.out.println(e);
        });

        System.out.println("\n\n\n\n");

        //任务的办理人
        assignee = "小张";
        log.info("小张的任务:");
        list = taskQuery.taskAssignee(assignee).list();
        list.stream().forEach(e -> {
            System.out.println(e);
        });

    }
    
运行结果:
com.codedef.ActivitiApplicationTests     : 小张的任务:
Task[id=15005, name=提交申请]

处理一个任务

    /**
     * 完成一个任务
     */
    @Test
    void compileTask() {
        String taskId="15005";
        //taskId:任务id
        taskService.complete(taskId);
        System.out.println("当前任务执行完毕");
    }

NOTICE: 执行完该Test后,ACT_RU_TASK表中的“小张:提交申请”的记录消失,出现“老大:经理审批”记录。
此时再次执行查询任务的Test,小张的任务为空,老大的任务中出现一条记录“Task[id=17502, name=经理审批]”。

多人会签

SpringBoot中引入Activiti并完成基本业务流程

标签:处理   概述   XML   base   管理器   connect   roo   标识   对象   

原文地址:https://www.cnblogs.com/mirage0/p/14280416.html


评论


亲,登录后才可以留言!