千家信息网

Activiti的知识点分析是什么

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这期内容当中小编将会给大家带来有关Activiti的知识点分析是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1.查询接口createXxxQuery查询接口中
千家信息网最后更新 2026年11月03日Activiti的知识点分析是什么

这期内容当中小编将会给大家带来有关Activiti的知识点分析是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

1.查询接口createXxxQuery

查询接口中的Xxx即为各种对象的查询方式,如createProcessDefinitionQuery为查询流程定义的方法。查询最后的调用有如下通用方法:

  • asc:升序,和list配合使用

  • desc:倒序,和list配合使用

  • count:返回计数

  • list:返回一个list

  • listPage:返回分页list

  • singleResult:返回单个对象

不同的查询接口需要调用不同的服务组件,如repositoryService提供流程定义相关的查询;identityService服务组件提供用户、用户组相关的查询;runtimeService提供流程实例相关的查询。

①常规查询:如下查询为声明了一个流程定义processDefinition来接受查询返回的单个对象,流程定义需要调用repositoryService服务组件中的createProcessDefinition,根据部署的id获取,流程定义的单个实体。

ProcessDefinition processDefinition=repositoryService.createProcessDefinitionQuery().                deploymentId(deployment.getId()).singleResult();

②自定义sql查询:可以使用自定义sql去根据数据库字段查询数据:

List groups=identityService.createNativeGroupQuery().sql("SELECT * FROM ACT_ID_GROUP where NAME=#{name}").parameter("name","group2");

2.流程文件部署

流程定义部署使用DeploymenBuilder对象,该对象提供了以下方法来实现流程部署:

  • addClasspathResource

  • addInputStream

  • addString

  • addZipInputStream

  • addBpmnModel

  • addBytes

  • deploy

如我们正常部署一个bpmn文件定义的流程定义使用如下代码:

DeploymentBuilder builder=repositoryService.createDeployment();builder.addClasspathResource("test1.bpmn");builder.deploy();

先使用DeploymenBuilder类来生命了一个builder对象,并通过repositoryService来创建部署,在之后使用builder的addClasspathResource方法将bpmn部署到数据库中,在此过程中该方法不仅回将bpmn文件内容存入数据库,也会根据bpmn生成对应的流程图png文件以通存入数据库。

流程定义部署完成后,还可以终止或激活流程定义,当终止流程定义时,该流程定义的流程实例不能再被启动。

//终止流程定义repositoryService.suspendProcessDefinitionByKey(ProcessDefinitionKey);//启动流程定义repositoryService.activateProcessDefinitionByKey(ProcessDefinitionKey);

3.任务操作

任务候选人(组):表示该任务可以由某个用户组(如经理)来完成。

任务持有人(owner):完成该任务时某个人的职责,那么这个人是此任务的持有人,一个任务只能由一个持有人。

任务代理人(assignee):由于本人不能及时处理任务,而委托给他人,这个人就是此任务代理人,一个任务只能由一个代理人。

对任务设置候选人,使用addCandidateUser将用户设置为某个人物的候选人,并将这种绑定关系记录到ACT_RU_IDENTITYLINK表中,代码如下:

String taskId = UUID.randomUUID().toString();//此处因为只是demo所以直接创建了一个task,正常情况下应该从流程实例中取出taskTask task = ts.newTask(taskId);task.setName("测试任务");ts.saveTask(task);//  创建用户String userId = UUID.randomUUID().toString();User user = is.newUser(userId);user.setFirstName("angus");is.saveUser(user);// 设置任务的候选用户ts.addCandidateUser(taskId, userId);//设置任务的持有用户ts.setOwner(taskId, userId);//设置任务的代理人,只能被声明一次代理人,再次声明会报错ts.claim(taskId, userId);

4.任务参数与附件

如何给任务设置参数:

//简单的任务参数保存在ACT_RU_VARIABLE表中taskSevice.setVariable(task.id,"var1","hello");//任务参数也可以保存一个对象,但是保存的对应类必须已经实现了serialize可序列话接口//如果保存对象,数据即序列话后的对象将会额外保存到ACT_GE_BYTEARRAYtaskSevice.setVariable(task.id,"person1",p);//取出存入的对象Person p=taskSevice.getVariable(task.id,"person1",Person.class);

任务参数有着不同的作用域:

  • 本地参数(setVariableLocal):当前节点完成后,参数就会失效。

  • 全局参数(setVariable):一直有效。

除了使用java代码set参数外,还可以在流程xml文件中保存参数:

                                    Crazyit                    

获取方法如下:

        String var = taskService.getVariable(task.getId(), "personName", String.class);

5.启动流程实例

流程实例(ProcessInstance)可以理解为我们根据流程定义(类)而创建的"对象"。

执行流(Execution)简单理解为工作流图中的一条条线路,而流程实例继承了执行流,因此也被称为著执行流。

ProcessInstance可以直接使用runService的startProcessInstance方法开创建,创建成功后他的数据将会被保存在ACT_RU_EXECUTION表中,需要注意的是尽管流程图如图只有一根线路,数据库中也会出现两条数据,一条为主执行流,一条为子执行流。

无论工作流图是怎么样的,都必定有一个主执行流,而有多少个分支就会有多少个子执行流。

startProcessInstance主要有三类分别是根据id、key和message消息来启动,前两个就是根据流程定义的id、key来启动,最后一个消息是等待一个消息来创建流程实例。

6.流程实例的运行

一般流程前进使用trigger方法,使用流程的id传参

        Execution exe = runService.createExecutionQuery()                .processInstanceId(pi.getId()).onlyChildExecutions()                .singleResult();        System.out.println(pi.getId() + ", 当前节点:" + exe.getActivityId());                // 让它往前走        runService.trigger(exe.getId());                exe = runService.createExecutionQuery()                .processInstanceId(pi.getId()).onlyChildExecutions()                .singleResult();        System.out.println(pi.getId() + ", 当前节点:" + exe.getActivityId());

信号事件:xml形式如下

                ...                                    ...    

它需要等待程序发出信号才能继续运行,不然就会在原地等待。

runService.signalEventReceived("testSignal");

消息事件:xml中需要先设定message标签,再在中间抛出事件中,创建消息事件定义,并使用messageRef属性执行message标签。

                ...                                    ...    

相应的程序中也只需要发出相应消息即可工作流继续向前进行

runService.messageEventReceived("testMsg", exe.getId());

区别:从信号和消息的方法参数就可以看出,信号的发送不需要制定特定的对象,而消息是需要制定流程的。简单来说信号像是广播,只要定义了该信号的人都会收到信号;而消息像私信只有收到消息的目标流程才会继续前行。

7.工作的产生和管理

异步任务产生的工作:下面的应用会使用到activiti引擎的异步执行,因此需要在activiti.cfg.xml中进行如下配置,开启异步执行,如果不开启此项配置,流程将会卡在ServiceTask不能继续向前运行。

之后创建bpmn工作流图,以xml格式打开,更改他的servicetask组件属性

activti:class指向的是他要执行的类(类需要实现JavaDelegate接口并且实现execute方法),而async属性则是开启异步执行。

package org.crazyit.act.c10;import org.activiti.engine.delegate.DelegateExecution;import org.activiti.engine.delegate.JavaDelegate;public class MyJavaDelegate implements JavaDelegate {    @Override    public void execute(DelegateExecution arg0) {        System.out.println("这是处理类");    }}

定时器任务:会等待定时结束在继续执行,如下:

                                    PT1M                    

被中断的任务:被suspend中断的任务会被写入ACT_RU_SUSPENED表中,同理activate重新激活被中断的任务,任务将会被从表中移除,恢复正常运行。

无法执行的任务:加入一个任务三次抛出异常,就将会被加入ACT_RU_DEADLETTER表中。

上述就是小编为大家分享的Activiti的知识点分析是什么了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。

流程 任务 查询 对象 参数 方法 消息 数据 实例 信号 用户 工作 代理人 接口 数据库 文件 代理 分析 事件 工作流 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 智能科技公司是互联网公司吗 深圳科技互联网 科技与互联网发展 以房互联网科技 嘟嘟瓜互联网科技 广州紫鲸互联网科技 互联网科技汛 深圳卡尔迅互联网科技有限公司怎么样 海南科技产业互联网平台 北京华百购互联网科技有限公司 互联网软件和科技 移动互联网科技公司 工业互联网展湾科技股份有限公司 郑州欣桑互联网科技有限公司 西安有哪些互联网高科技企业 中国科技和美国互联网 互联网科技和医药行业 科技互联网公司两年变化 东风日产互联网科技公司叫什么 科技发展第三阶段互联网时代 互联网科技巨头监管 互联网属科技 紫鲸互联网科技 电子科技大学互联网 安控科技rtu产品工业互联网 宁夏众和广鑫互联网科技有限公司 千方科技属于互联网企业吗 燊美集互联网科技有限公司 为客找房互联网科技公司怎么样 沐思想互联网科技有限公司
0