springboot整合activiti工作流引擎demo源码

1、添加activiti相关依赖

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>activiti</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>activiti</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <activiti.version>5.22.0</activiti.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-core</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-engine</artifactId>
            <version>${activiti.version}</version>
        </dependency>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring</artifactId>
            <version>${activiti.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.codehaus.jackson</groupId>
                    <artifactId>jackson-core-asl</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-context</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-jdbc</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-tx</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-orm</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-beans</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>mybatis</artifactId>
                    <groupId>org.mybatis</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>activation</artifactId>
                    <groupId>javax.activation</groupId>
                </exclusion>
            </exclusions>

        </dependency>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring-boot-starter-basic</artifactId>
            <version>${activiti.version}</version>
        </dependency>

        <!-- Activiti 流程图 -->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-common-rest</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        <!-- Activiti 在线设计 -->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-modeler</artifactId>
            <version>5.22.0</version>
            <exclusions>
                <exclusion>
                    <artifactId>spring-beans</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-context</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-core</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-tx</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-web</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-security-config</artifactId>
                    <groupId>org.springframework.security</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-security-core</artifactId>
                    <groupId>org.springframework.security</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-security-crypto</artifactId>
                    <groupId>org.springframework.security</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-security-web</artifactId>
                    <groupId>org.springframework.security</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-webmvc</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>activation</artifactId>
                    <groupId>javax.activation</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>commons-io</artifactId>
                    <groupId>commons-io</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.61</version>
        </dependency>



        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>



    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
复制代码

2、application.properties相关配置

复制代码
server.port=9091

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/activiti?allowPublicKeyRetrieval=true&useSSL=FALSE&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8&nullCatalogMeansCunrrent=true
spring.datasource.username=root
spring.datasource.password=123123
spring.datasource.max-active=20
spring.datasource.max-idle=8
spring.datasource.min-idle=8
spring.datasource.initial-size=10
spring.jpa.properties.hibernate.show_sql=true
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.activiti.check-process-definitions=false
复制代码

3、启动Application

 

复制代码
package com.example.activiti;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan("com")
@EnableAutoConfiguration(exclude = {org.activiti.spring.boot.SecurityAutoConfiguration.class})
public class ActivitiApplication {

    public static void main(String[] args) {
        SpringApplication.run(ActivitiApplication.class, args);
    }

}
application 启动类
复制代码

4、controller

复制代码
package com.example.activiti.controller;

import com.example.activiti.service.ActivityConsumerService;
import org.activiti.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.io.FileNotFoundException;
import java.util.List;

/**
 * @Author: zhengyixin
 * @Description:
 * @Date: 2021/4/14 下午 04:01
 */

@RestController
@RequestMapping("/activiti")
public class ActivitiController {

    @Autowired
    private ActivityConsumerService  activityConsumerService;

    /**
     * 注册流程
     * @return
     */
    @RequestMapping("/createDeployment")
    public Boolean createDeployment() throws FileNotFoundException {
        return activityConsumerService.createDeployment();
    }

    /**
     * 启动流程
     * @return
     */
    @RequestMapping("/startActivityDemo")
    public Boolean startActivityDemo(@RequestParam(name = "key") String key){
        return activityConsumerService.startActivityDemo(key);
    }

    /**
     * 获取待办
     * @return
     */
    @RequestMapping("/getTaskList")
    public List<Task> getTaskList(@RequestParam(name="assignee") String assignee){
        return activityConsumerService.getTaskList(assignee);
    }

    /**
     * 提交
     * @param taskId
     * @return
     */
    @RequestMapping("/complete")
    public boolean complete(@RequestParam(name="taskId") String taskId){

        return activityConsumerService.complete(taskId);
    }
    /**
     * 根据流程id直接结束流程
     * @paramru
     * @return
     */
    @RequestMapping("/deleteProcessInstance")
    public boolean deleteProcessInstance(String runId){
        return activityConsumerService.deleteProcessInstance(runId);
    }

}
controller
复制代码

5、service

复制代码
package com.example.activiti.service;

import org.activiti.engine.task.Task;

import java.io.FileNotFoundException;
import java.util.List;

/**
 * @Author: zhengyixin
 * @Description:
 * @Date: 2021/4/14 下午 04:03
 */
public interface ActivityConsumerService {
    boolean createDeployment() throws FileNotFoundException;
    boolean startActivityDemo(String key);
    public List<Task> getTaskList(String assignee);
    boolean  complete(String taskId);
    boolean  deleteProcessInstance(String runId);
}
View Code
复制代码

6、service实现类

复制代码
package com.example.activiti.service.serviceimpl;

import com.example.activiti.service.ActivityConsumerService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.DeploymentBuilder;

import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.sql.SQLOutput;
import java.util.List;

/**
 * @Author: zhengyixin
 * @Description:
 * @Date: 2021/4/14 下午 04:04
 */
@Service
public class ActivityConsumerServiceImpl implements ActivityConsumerService {
    @Autowired
   private RuntimeService runtimeService;

    @Autowired
    private TaskService taskService;

    @Autowired
    private RepositoryService repositoryService;

    @Autowired
    ProcessEngine processEngine;

    /**
     * 注册一个流程
     * @return
     */
    @Override
    public boolean createDeployment() throws FileNotFoundException {

        File bpmnPath=new File("C:/JavaProject/activiti/contract.bpmn");
     /*   builder.addClasspathResource("askformoney.bpmn");
        builder.deploy();*/
        InputStream fis=new FileInputStream(bpmnPath);
        RepositoryService repositoryService=processEngine.getRepositoryService();
        DeploymentBuilder builder=repositoryService.createDeployment();
        builder.addInputStream("contract.bpmn",fis);
        builder.deploy();


        return true;
    }

    /**
     * 查询当前用户的待办事项
     * @param assignee 用户id
     * @return
     */
    public List<Task> getTaskList(String assignee){
        //获取待办的一些信息,这里可以传入需要查询的用户,
        //我这里查询的所有待办
        System.out.println(assignee);
        List<Task> tasks = taskService.createTaskQuery().taskAssignee(assignee).list();
       // List<Task> tasks = taskService.createTaskQuery().list();
        for (Task t:tasks) {
            System.out.println(t.getCreateTime());
            System.out.println(t.getId());
            System.out.println(t.getName());
            System.out.println(t.getProcessInstanceId());
            System.out.println(t.getTaskDefinitionKey());
            System.out.println(t.getParentTaskId());
        }
      return tasks;
    }


    /**
     * 根据流程key开启一个流程
     * @param key
     * @return
     */
    @Override
    public boolean startActivityDemo(String key) {
      //  ProcessInstance test01 = runtimeService.startProcessInstanceByKey(key);key 是表act_re_procdef的Key字段
        ProcessInstance test01=runtimeService.startProcessInstanceById(key);//表act_re_procdef  ID_字段
        String id = test01.getId();
        System.out.println("流程id="+id);
        /*  */
        /*    String assignee = "abc";*/
        return true;
    }

    /**
     * 根据任务id提交任务
     * @param taskId
     * @return
     */
    @Override
    public boolean  complete(String taskId){
        taskService.complete(taskId);
        return true;
    }

    /**
     * 根据流程id直接结束流程  表act_hi_sctinst的ID_ 或者act_ru_task表的ID_
     * @param runId
     * @return
     */
    @Override
    public boolean  deleteProcessInstance(String runId){
        runtimeService.deleteProcessInstance(runId,"结束");
        return true;
    }


}
View Code
复制代码

 启动项目时会自动在数据库创建26个表

 

7、添加一个流程定义bpmn文件(这里需要在idea上安装一个actiBPM插件,这个插件在Plugins库可能检索不到,需要去idea官网找jar包安装),bpmn图要保存在项目根目录下,不然有可能会报ClassPathResource Not Found 。UserTask节点上的Assignee就是审核人的意思,这个地方有个坑,明明填上去了,关掉bpmn文件之后再次打开值就没了,目前找到的解决方案是先不关bpmn文件,注册启动该流程,assignee就能保存上

 a、注册流程:请求接口 localhost:9091/activiti/createDeployment  会在act_re_procdef 表生成有一条记录

 

 

 b、启动流程:请求接口localhost:9091/activiti/startActivityDemo?key=contract_check:1:4 会在act_ru_task表新增一条记录,这个表记录的是当前正在执行的流程实例节点状态

 

 c、查询某个审核人的待办任务:localhost:9091/activiti/getTaskList?assignee=wanghaochuan

 d、提交任务 localhost:9091/activiti/complete?taskId=8

      act_ru_task记录的数据会跳到下一个节点

 

 

  

posted @   smellycats  阅读(1150)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示