springboot整合Activiti-常用方法(部署、启动、查询、执行任务)

这篇具有很好参考价值的文章主要介绍了springboot整合Activiti-常用方法(部署、启动、查询、执行任务)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、springboot整合activiti7

ps:activiti7强依赖security,所以还需要整合security,这里就当整合成功了。

真不会整合,就看我下面这个博文
日常记录-SpringBoot整合SpringSecurity(前后分离)+JWT+Redis

1、activiti7的核心依赖

<!--引入activiti的springboot启动器 7.1.0.M6是支持jdk1.8的最后一个版本-->
<dependency>
    <groupId>org.activiti</groupId>
    <artifactId>activiti-spring-boot-starter</artifactId>
    <version>7.1.0.M6</version>
    <exclusions>
        <exclusion><!-- 排除activiti的mybatis,避免和外面的mybatis-plus冲突 -->
            <artifactId>mybatis</artifactId>
            <groupId>org.mybatis</groupId>
        </exclusion>
    </exclusions>
</dependency>

<!-- 依赖:spring-security -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

2、yml配置

spring:
  activiti:
    #自动更新数据库结构
    #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常
    #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建
    #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表)
    #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎)
    database-schema-update: false
    #activiti7默认不生成历史信息表,开启历史表
    db-history-used: false
    #记录历史等级 可配置的历史级别有none, activity, audit, full
    #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。
    #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。
    #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。
    #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。
    history-level: none
    # =============================
    #自动检查、部署流程定义文件
    check-process-definitions: false
    # 关闭 SpringAutoDeployment never-fail
    deployment-mode: never-fail
    # asyncExecutorActivate是指activiti在流程引擎启动就激活AsyncExecutor,异步:true-开启(默认)、false-关闭
    async-executor-activate: true

    #流程定义文件存放目录,要具体到某个目录
    #      process-definition-location-prefix: classpath:/processes/holliday/
    #process-definition-location-suffixes: #流程文件格式
    #  - **.bpmn20.xml
    #  - **.bpmn

3、activiti7默认生成的表

启动成功后就看到下面的表

  1. activiti7默认不生成act_hi历史表
  2. 如果不生成历史表,还需要禁用插入历史数据【spring.activiti.history-level:=none】

activit 整合springboot,Activiti,spring boot,java,数据库
activiti常用的服务

   @Autowired
    private RepositoryService repositoryService;

    @Autowired
    private RuntimeService runtimeService;

    @Autowired
    private TaskService taskService;

二、部署流程

1、静态部署流程

java代码

//使用RepositoryService进行部署
DeploymentBuilder builder = repositoryService.createDeployment();
builder.addClasspathResource("bpmn/demo1/demo1.bpmn20.xml");
builder.addClasspathResource("bpmn/demo1/demo1.png");
builder.tenantId("212121");//区分同一个流程所属系统,该值主要用于记录启动的流程实例归属于哪个系统。
builder.name("串行并行配置工作流");
Deployment deployment = builder.deploy();
//输出部署信息
System.out.println("流程部署id:" + deployment.getId());
System.out.println("流程部署名称:" + deployment.getName());

bpmn文件路径
activit 整合springboot,Activiti,spring boot,java,数据库

2、动态部署流程

controller代码

/**
     * 部署流程
     * @param fileBpmn bpmn文件
     * @param fileSvg  svg图片
     * @param name     流程名称
     * @param key      流程key
     * @param tenantId 系统标识 -> 同一个流程可以部署多次,互不干扰,系统标识必须唯一
     * @return
     */
    @PostMapping(value="/saveDeploy")
    public ApiResult saveDeploy(@RequestPart(name = "fileBpmn", required = true) MultipartFile fileBpmn,
                                @RequestPart(name = "fileSvg", required = true) MultipartFile fileSvg,
                                @RequestParam("name") String name,
                                @RequestParam("key") String key,
                                @RequestParam("tenantId") String tenantId){
        
        activitiService.saveDeploy(fileBpmn,fileSvg,name,key,tenantId);
        return ApiResult.ok("成功");
    }

service代码

void saveDeploy(MultipartFile fileBpmn, MultipartFile fileSvg, String name, String key,String tenantId);

serviceImpl代码

 @Override
    public void saveDeploy(MultipartFile fb, MultipartFile fg, String name, String key,String tenantId) {

        //1:使用File 类创建一个要操作的文件路径
        //File file = new File("D:" + File.separator + bpmnZip);
       /* File fileBpmn = new File("D:" + File.separator + fb);
        File fileSvg = new File("D:" + File.separator + fg);*/

        //System.out.println(file.getPath());

        InputStream inputStreamBpmn = null;
        InputStream inputStreamSvg = null;

        try {
            inputStreamBpmn = fb.getInputStream();
            inputStreamSvg = fg.getInputStream();
            /*
            这是压缩包部署
            ZipInputStream zipInputStream = new ZipInputStream(inputStream);
            System.out.println(inputStream);
            */

            // 流程部署
            Deployment deployment = repositoryService.createDeployment()
                    .name(name)
                    .key(key)
                    .addInputStream(fb.getOriginalFilename(),inputStreamBpmn)
                    .addInputStream(fg.getOriginalFilename(),inputStreamSvg)
                    //.category("vvvv")
                    .tenantId(tenantId)
                    //.addZipInputStream(zipInputStream)
                    .deploy();
            System.out.println("流程部署id:" + deployment.getId());
            System.out.println("流程部署名称:" + deployment.getName());
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                inputStreamBpmn.close();
                inputStreamSvg.close();
            }catch (Exception e){
                e.printStackTrace();
            }

        }

    }

3、部署流程相关联表

部署成功后,这几张表会有数据

act_ge_bytearray(二进制数据表,存储通用的流程定义和流程资源)
activit 整合springboot,Activiti,spring boot,java,数据库
act_re_deployment(部署单元信息表)
activit 整合springboot,Activiti,spring boot,java,数据库
act_re_procdef(已部署的流程定义)
activit 整合springboot,Activiti,spring boot,java,数据库

三、启动流程

1、startProcessInstanceByKey(推荐使用)

//参数 processDefinitionKey -> act_re_procdef.KEY_

//参数 businessKey -> 一般是你业务的唯一标识,把该流程和你的业务绑定一起

//参数 Map<String, Object> variables -> 流程变量

ProcessInstance startProcessInstanceByKey(String processDefinitionKey);

ProcessInstance startProcessInstanceByKey(String processDefinitionKey, String businessKey);

ProcessInstance startProcessInstanceByKey(String processDefinitionKey, Map<String, Object> variables);

ProcessInstance startProcessInstanceByKey(String processDefinitionKey, String businessKey, Map<String, Object> variables);

2、startProcessInstanceByKeyAndTenantId(推荐使用)


//参数 processDefinitionKey -> act_re_procdef.KEY_

//参数 businessKey -> 一般是你业务的唯一标识,把该流程和你的业务绑定一起

//参数 Map<String, Object> variables -> 流程变量

//参数 tenantId -> 系统唯一标识(类似同一型号的手机有不同的串码)

ProcessInstance startProcessInstanceByKeyAndTenantId(String processDefinitionKey, String tenantId);

ProcessInstance startProcessInstanceByKeyAndTenantId(String processDefinitionKey, String businessKey, String tenantId);

ProcessInstance startProcessInstanceByKeyAndTenantId(String processDefinitionKey, Map<String, Object> variables, String tenantId);

ProcessInstance startProcessInstanceByKeyAndTenantId(String processDefinitionKey, String businessKey, Map<String, Object> variables, String tenantId);

3、startProcessInstanceById

//参数 processDefinitionId-> act_re_procdef.ID_

//参数 businessKey -> 一般是你业务的唯一标识,把该流程和你的业务绑定一起

//参数 Map<String, Object> variables -> 流程变量


ProcessInstance startProcessInstanceById(String processDefinitionId);

ProcessInstance startProcessInstanceById(String processDefinitionId, String businessKey);

ProcessInstance startProcessInstanceById(String processDefinitionId, Map<String, Object> variables);

ProcessInstance startProcessInstanceById(String processDefinitionId, String businessKey, Map<String, Object> variables);

获取processDefinitionId的java代码

        //一般来说,你也不会设置key和tenantId一样的数据
        ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
        ProcessDefinition processDefinition = processDefinitionQuery.processDefinitionKey("demo1").processDefinitionTenantId("212121").singleResult();
        System.out.println("processDefinition的主键ID:"+processDefinition.getId());

        //通过processDefinitionId启动流程
        ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());

        //输出实例信息
        System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());
        System.out.println("流程实例id:" + processInstance.getId());
        System.out.println("当前活动Id:" + processInstance.getActivityId());

4、startProcessInstanceByMessage

部署流程的时候没有配tenantId

ProcessInstance startProcessInstanceByMessage(String messageName);

ProcessInstance startProcessInstanceByMessage(String messageName, String businessKey);

ProcessInstance startProcessInstanceByMessage(String messageName, Map<String, Object> processVariables);

ProcessInstance startProcessInstanceByMessage(String messageName, String businessKey, Map<String, Object> processVariables);

5、startProcessInstanceByMessageAndTenantId

部署流程的时候有配tenantId

ProcessInstance startProcessInstanceByMessageAndTenantId(String messageName, String tenantId);

ProcessInstance startProcessInstanceByMessageAndTenantId(String messageName, String businessKey, String tenantId);

ProcessInstance startProcessInstanceByMessageAndTenantId(String messageName, Map<String, Object> processVariables, String tenantId);

ProcessInstance startProcessInstanceByMessageAndTenantId(String messageName, String businessKey, Map<String, Object> processVariables, String tenantId);

实例
activit 整合springboot,Activiti,spring boot,java,数据库

message 和 process 是同级的
<message id="myMessage" name="testMessage"/>

如果start事件用了messageRef,一定要配相应的message

act_ru_event_subscr表(运行时事件),部署成功就有数据了
activit 整合springboot,Activiti,spring boot,java,数据库
java代码1

ProcessInstance processInstance = runtimeService.startProcessInstanceByMessageAndTenantId("testMessage","888888");

//输出实例信息
System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());
System.out.println("流程实例id:" + processInstance.getId());
System.out.println("当前活动Id:" + processInstance.getActivityId());

java代码2

//<message id="myMessage" name="testMessage"/>
Execution execution = runtimeService.createExecutionQuery().messageEventSubscriptionName("testMessage").singleResult();
log.info("execution = {}", execution);
runtimeService.messageEventReceived("testMessage",execution.getId());

四、任务执行

1、任务查询

 //TaskService已经封装好了,根据自己的业务查询,这里只是简单的演示
 //根据流程key查询任务
 List<Task> list = taskService.createTaskQuery()
         .processDefinitionKey("demo1")//act_re_procdef.KEY_
         //.taskAssignee() //任务负责人 
         .list();

 for (Task task : list) {

     System.out.println("流程实例id:" + task.getProcessInstanceId());
     System.out.println("任务id:" + task.getId());
     System.out.println("任务负责人:" + task.getAssignee());
     System.out.println("任务名称:" + task.getName());

 }

2、拾取任务

// 可以拾取任务
//参数1 任务id
//参数2 负责人名称
taskService.claim("41691bf7-47c9-11ee-af01-002b67defec7","负责人名称");

3、归还任务

// 如果设置为null,归任务没有负责人
taskService.setAssignee("41691bf7-47c9-11ee-af01-002b67defec7",null);

4、查询任务候选人

//查询任务候选人
//参数1 任务id
List<IdentityLink> identityLinkList = taskService.getIdentityLinksForTask("41691bf7-47c9-11ee-af01-002b67defec7");
for (IdentityLink identityLink : identityLinkList) {
    System.out.println(identityLink.getUserId());
}

5、查询当前用户待审核的任务

// 查看当前用户待审核记录(任务给别人拾取也能查询)
//参数1 你定义的用户名称或用户id
List<Task> list = taskService.createTaskQuery().taskInvolvedUser("user1")
        .orderByTaskCreateTime().desc()
        .list();// 代办列表

for (Task task : list) {

    System.out.println("流程实例id:" + task.getProcessInstanceId());
    System.out.println("任务id:" + task.getId());
    System.out.println("任务负责人:" + task.getAssignee());
    System.out.println("任务名称:" + task.getName());

}

6、执行待审核的任务

//先查询任务是否给当前用户拾取了
Task task = taskService.createTaskQuery()
        .taskId("任务id")
        .taskAssignee("负责人名称")
        .singleResult();
//再执行任务
if(task != null){
    taskService.complete("任务id");
    System.out.println("完成任务");
}

7、其他

常用的服务就这三个了,基本能满足大部分需求文章来源地址https://www.toymoban.com/news/detail-808402.html

@Autowired
private RepositoryService repositoryService;

@Autowired
private RuntimeService runtimeService;

@Autowired
private TaskService taskService;

到了这里,关于springboot整合Activiti-常用方法(部署、启动、查询、执行任务)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Springboot整合activiti5,达梦数据库,mybatis中间件

    由于工作流引擎不支持达梦数据库以及国产中间件,所以我们引入的时候会报错,这个时候就需要去改造代码和配置文件。各种文档和资料查找一天,现在对这个问题进行解决了。 1.查看网上的各类教程,手动将源码复制粘贴出来,进行修改。这方面可以自行去查找对应文档

    2024年02月14日
    浏览(40)
  • SpringBoot整合Activiti实现工作流的低代码系统(附源码和配套文档)

    activiti工作流引擎项目,企业erp、oa、hr、crm等企事业办公系统轻松落地,一套完整并且实际运用在多套项目中的案例,满足日常业务流程审批需求。 springboot+vue+activiti集成了activiti在线编辑器,流行的前后端分离部署开发模式,快速开发平台,可插拔工作流服务。工作流表单

    2024年03月15日
    浏览(73)
  • SpringBoot框架——8.MybatisPlus常见用法(常用注解+内置方法+分页查询)

    1.MybatisPlus常用注解:         1.1 当数据库、表名和字段名和实体类完全一致时无需加注解,不一致时:         @TableName指定库名         @TableId指定表名         @TableField指定字段名         1.2 自增主键:         @TableId(type=IdType.AUTO)         private Long id;        

    2024年04月26日
    浏览(41)
  • 09、全文检索 -- Solr -- SpringBoot 整合 Spring Data Solr (生成DAO组件 和 实现自定义查询方法)

    测试类使用 solrClient 进行添加、查询、删除文档的操作在这篇的代码基础上继续演示的 两篇文章的区别: 上一篇是通过SolrClient 连接 Solr,然后用 SolrClient 来调用查询方法进行全文检索 这一篇是 自定义dao组件,通过继承CrudRepository 接口,用 dao 接口来调用查询方法进行全文检

    2024年02月19日
    浏览(58)
  • SpringBoot2.0(Spring读取配置文件常用方法,打war包在Tomcat中启动)

    在springBoot声明周期内,可以使用@Value注解从SpringBoot的默认配置文件中读取配置信息 例如在Controller中使用: @Value可以放到属性或方法上,能够正常使用的前提是所在类,必须在SpringBoot的生命周期内。 我们怎么把一个类放到Spring的生命周期中进行管理?使用的是@Component注解

    2024年02月09日
    浏览(52)
  • 模仿Activiti工作流自动建表机制,实现Springboot项目启动后自动创建多表关联的数据库与表的方案

    文/朱季谦 熬夜写完,尚有不足,但仍在努力学习与总结中,而您的点赞与关注,是对我最大的鼓励! 在一些本地化项目开发当中,存在这样一种需求,即开发完成的项目,在第一次部署启动时,需能自行构建系统需要的数据库及其对应的数据库表。 若要解决这类需求,其实

    2024年01月24日
    浏览(58)
  • SpringBoot整合RestHighLevelClient实现查询操作

    😊 @ 作者: 一恍过去 💖 @ 主页: https://blog.csdn.net/zhuocailing3390 🎊 @ 社区: Java技术栈交流 🎉 @ 主题: SpringBoot整合RestHighLevelClient实现查询操作 ⏱️ @ 创作时间: 2022年08月14日 为了方便查询操作,创建索引叫做: nba ,并且添加数据,http请求如下: 结果: term 查询被用于

    2024年02月04日
    浏览(45)
  • SpringBoot(57) 整合Plumelog实现日志查询

    一、前言 Plumelog 一个简单易用的java分布式日志组件 https://gitee.com/plumeorg/plumelog 二、docker-compose一键搭建日志服务 plumelog + elasticsearch + redis tips: 详情可查看 https://gitee.com/zhengqingya/docker-compose 访问地址:ip地址:8891 账号:admin 密码:admin docker-compose.yml 三、SpringBoot整合Plumelog 1、

    2023年04月24日
    浏览(46)
  • Springboot中整合netty启动后,项目无法正常启动?

      1.现象描述 netty等一般放在程序启动后再启动,多以下面方式启动: 如果在 Order 后面还有其它模块被启动,那么其它模块就会被阻塞。 2.原因分析 主线程启动netty后,netty会将主线程阻塞。因此,需要采用异步方式或使用线程池来启动netty。 3.解决办法 添加异步注解@Async

    2024年02月13日
    浏览(36)
  • ElasticSearch系列 - SpringBoot整合ES:组合多个查询条件 bool 查询

    01. ElasticSearch 布尔查询是什么? 在实际应用中,我们很有可能会查询多个值或字段。 一个 bool 查询由三部分组成: must:所有的语句都必须(must) 匹配,与 AND 等价。 must_not:所有的语句都不能(must not)匹配,与 NOT 等价。 should:至少有一个语句要匹配,与 OR 等价。 02.

    2023年04月08日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包