FlowableAPI的使用
RuntimeService runtimeService = processEngine.getRuntimeService();
RepositoryService repositoryService = processEngine.getRepositoryService();
TaskService taskService = processEngine.getTaskService();
ManagementService managementService = processEngine.getManagementService();
IdentityService identityService = processEngine.getIdentityService();
HistoryService historyService = processEngine.getHistoryService();
FormService formService = processEngine.getFormService();
DynamicBpmnService dynamicBpmnService = processEngine.getDynamicBpmnService();
Query API 查询接口
从引擎查询数据有两种方式:查询API和本机查询。查询 API 允许您使用流畅的 API 编写完全类型安全的查询。您可以向查询添加各种条件(所有这些条件都作为逻辑 AND 一起应用)和精确的一个排序。以下代码显示了一个示例:
// 指定查询条件,仅返回分配给 "kermit" 用户的任务
//指定查询条件,仅返回流程变量 "orderId" 的值为 "0815" 的任务。这表示只查询具有特定订单ID的任务。
//按照任务的到期日期(Due Date)升序
List<Task> tasks = taskService.createTaskQuery()
.taskAssignee("kermit")
.processVariableValueEquals("orderId", "0815")
.orderByDueDate().asc()
.list();
Variables 变量
每个流程实例都需要并使用数据来执行其组成的步骤。在 Flowable 中,这些数据称为变量,存储在数据库中。变量可以用在表达式中(例如,在独占网关中选择正确的外出顺序流),在调用外部服务时的Java服务任务中(例如,提供服务调用的输入或存储服务调用的结果)等等。在。
流程实例可以具有变量(称为流程变量),而且执行(是指向流程活动位置的特定指针)和用户任务也可以具有变量。流程实例可以具有任意数量的变量。每个变量都存储在 ACT_RU_VARIABLE
数据库表中的一行中。
所有 startProcessInstanceXXX 方法都有一个可选参数,用于在创建和启动流程实例时提供变量。例如,从运行时服务:
RuntimeService runtimeService = processEngine.getRuntimeService();
/*键是稍后将用于检索变量的标识符*/
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("employee", employee);
variables.put("nrOfHolidays", nrOfHolidays);
variables.put("description", description);
/*当流程实例启动时,将创建一个执行并将其放入启动事件中。从那里开始,此执行遵循用户任务的序列流以供经理批准并执行用户任务行为。
此行为将在数据库中创建一个任务,稍后可以使用查询找到该任务。用户任务处于等待状态,引擎将停止进一步执行任何操作,返回 API 调用。*/
ProcessInstance processInstance =
runtimeService.startProcessInstanceByKey("holidayRequest", variables);//<!-- 使用密钥启动流程 -->
可以在流程执行期间添加变量。例如,(运行时服务):
void setVariable(String executionId, String variableName, Object value);
void setVariableLocal(String executionId, String variableName, Object value);
void setVariables(String executionId, Map<String, ? extends Object> variables);
void setVariablesLocal(String executionId, Map<String, ? extends Object> variables);
还可以检索变量,如下所示。请注意,TaskService 上也存在类似的方法。这意味着任务(如执行)可以具有仅在任务持续时间内“活动”的局部变量。
Map<String, Object> getVariables(String executionId);
Map<String, Object> getVariablesLocal(String executionId);
Map<String, Object> getVariables(String executionId, Collection<String> variableNames);
Map<String, Object> getVariablesLocal(String executionId, Collection<String> variableNames);
Object getVariable(String executionId, String variableName);
<T> T getVariable(String executionId, String variableName, Class<T> variableClass);
变量通常用在 Java 委托、表达式、执行或任务侦听器、脚本等中。在这些构造中,当前执行或任务对象可用,并且可用于变量设置和/或检索。最简单的方法是:
// 获取实际的任务列表
TaskService execution = processEngine.getTaskService();
execution.getVariables();
execution.getVariables(Collection<String> variableNames);
execution.getVariable(String variableName);
execution.setVariables(Map<String, object> variables);
execution.setVariable(String variableName, Object value);
RepositoryService API
RepositoryService 很可能是使用Flowable引擎要用的第一个服务。这个服务提供了管理与控制部署(deployments)与流程定义(process definitions)的操作。在这里简单说明一下,流程定义是BPMN 2.0流程对应的Java对象,体现流程中每一步的结构与行为。部署是Flowable引擎中的包装单元,一个部署中可以包含多个BPMN 2.0 XML文件及其他资源。开发者可以决定在一个部署中包含的内容,可以是单个流程的BPMN 2.0 XML文件,也可以包含多个流程及其相关资源(如’hr-processes’部署可以包含所有与人力资源流程相关的的东西)。RepositoryService可用于部署这样的包。部署意味着将它上传至引擎,引擎将在储存至数据库之前检查与分析所有的流程。在部署操作后,可以在系统中使用这个部署包,部署包中的所有流程都可以启动。
RepositoryService接口操作的表
- act_re_deployment:部署信息表,存储流程定义、模板部署信息;
- act_re_procdef:流程定义信息表,存储流程定义相关描述信息,流程定义的bpmn文件放在act_ge_bytearray表中,以字节形式存储;
- act_re_model:流程模板信息表,存储流程模板相关描述信息,流程定义的bpmn文件放在act_ge_bytearray表中,以字节形式存储;
此外,这个服务还可以:
- 查询引擎现有的部署与流程定义。
- 暂停或激活部署中的某些流程,或整个部署。暂停意味着不能再对它进行操作,激活刚好相反,重新使它可以操作。
- 获取各种资源,比如部署中保存的文件,或者引擎自动生成的流程图。
- 获取POJO版本的流程定义。它可以用Java而不是XML的方式查看流程。
例如: 生成流程的图谱
/**
* 生成流程的图谱
* @param httpServletResponse
* @param processInstanceId 活动实例id
*/
@Override
public void genProcessDiagram(HttpServletResponse httpServletResponse, String processInstanceId) throws RuntimeException, IOException {
ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
if (pi == null) {
throw new RuntimeException("不存在该流程或流程已经走完");
}
// 查询当前任务
Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
// 查询当前正在执行的 task
List<Execution> executions = runtimeService.createExecutionQuery().processInstanceId(task.getProcessInstanceId()).list();
//得到正在执行的Activity的Id
List<String> activityIds = new ArrayList<>();
List<String> flows = new ArrayList<>();
for (Execution exe : executions) {
List<String> ids = runtimeService.getActiveActivityIds(exe.getId());
activityIds.addAll(ids);
}
//获取流程图
BpmnModel bpmnModel = repositoryService.getBpmnModel(pi.getProcessDefinitionId());
ProcessEngineConfiguration engineConf = processEngine.getProcessEngineConfiguration();
ProcessDiagramGenerator diagramGenerator = engineConf.getProcessDiagramGenerator();
InputStream in = diagramGenerator.generateDiagram(bpmnModel,
"png",
activityIds,
flows,
engineConf.getActivityFontName(),
engineConf.getLabelFontName(),
engineConf.getAnnotationFontName(),
engineConf.getClassLoader(),
1.0,
true);
OutputStream out = null;
byte[] buf = new byte[1024];
int length = 0;
try {
out = httpServletResponse.getOutputStream();
while ((length = in.read(buf)) != -1) {
out.write(buf, 0, length);
}
} finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
相关API
// 开始创建新部署
DeploymentBuilder createDeployment();
//删除给定的部署 deploymentId: 部署的id
void deleteDeployment(String deploymentId);
// 设置部署类别
void setDeploymentCategory(String deploymentId, String category);
// 设置部署密匙
void setDeploymentKey(String deploymentId, String key);
// 检索给定部署的部署资源列表,按字母顺序排序
List<String> getDeploymentResourceNames(String deploymentId);
// 通过字节流访问部署资源。deploymentId–部署的id resourceName–资源的名称
InputStream getResourceAsStream(String deploymentId, String resourceName);
//获取流程图
BpmnModel getBpmnModel(String processDefinitionId);
// 创建新模型。该模型是瞬态的,必须使用saveModel(model)进行保存。
Model newModel();
// 保存模型
void saveModel(Model model);
// 查询模型
ModelQuery createModelQuery();
.....
RuntimeService API
RuntimeService 用于启动流程定义的新流程实例。前面介绍过,流程定义中定义了流程中不同步骤的结构与行为。流程实例则是流程定义的实际执行过程。同一时刻,一个流程定义通常有多个运行中的实例。RuntimeService也用于读取与存储流程变量。流程变量是流程实例中的数据,可以在流程的许多地方使用(例如排他网关经常使用流程变量判断流程下一步要走的路径)。RuntimeService还可以用于查询流程实例与执行(Execution)。执行也就是BPMN 2.0中 ‘token’ 的概念。通常执行是指向流程实例当前位置的指针。最后,还可以在流程实例等待外部触发时使用RuntimeService,使流程可以继续运行。流程有许多等待状态(wait states),RuntimeService服务提供了许多操作用于“通知”流程实例:已经接收到外部触发,流程实例可以继续运行。
RuntimeService,taskService接口操作的表
- act_ru_task:运行时流程任务节点表,存储运行中流程的任务节点信息,重要,常用于查询人员或部门的待办任务时使用;
- act_ru_event_subscr:监听信息表,不常用;
- act_ru_execution:运行时流程执行实例表,记录运行中流程运行的各个分支信息(当没有子流程时,其数据与act_ru_task表数据是一一对应的);
- act_ru_identitylink:运行时流程人员表,重要,常用于查询人员或部门的待办任务时使用;
- act_ru_job:运行时定时任务数据表,存储流程的定时任务信息;
- act_ru_variable:运行时流程变量数据表,存储运行中的流程各节点的变量信息;
// 根据 流程实例ID 获取流程实例对象
ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
// 按键启动进程实例:processDefinitionKey–流程定义的键,不能为null。variables–要传递的变量,可以为null。
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("model-test", variables);
// 根据 流程实例ID 查询执行中的在流程实例中表示“执行路径”。请注意,ProcessInstance也是一种执行。
List<Execution> executions = runtimeService.createExecutionQuery().processInstanceId(task.getProcessInstanceId()).list();
//查找在活动中等待的所有执行的活动ID。这是一个列表,因为单个活动可以多次处于活动状态
List<String> getActiveActivityIds(String executionId);
// 获取开始表单模型 processDefinitionId–应检索其起始表单的流程定义的id。processInstanceId–应检索其起始表单的流程实例的id。
FormInfo getStartFormModel(String processDefinitionId, String processInstanceId);
TaskService
TaskService
所有任务相关的东西都组织在TaskService中,例如:
- 查询分派给用户或组的任务
- 创建独立运行(standalone)任务。这是一种没有关联到流程实例的任务。
- 决定任务的执行用户(assignee),或者将用户通过某种方式与任务关联。
- 认领(claim)与完成(complete)任务。认领是指某人决定成为任务的执行用户,也即他将会完成这个任务。完成任务是指“做这个任务要求的工作”,通常是填写某个表单。
相关API
// 创建与任何流程实例都不相关的新任务。返回的任务是暂时的,必须使用saveTask(task)“手动”保存
Task newTask();
//使用用户定义的任务id创建新任务
Task newTask(String taskId);
//构建任务对象(Task)。它的主要作用是帮助创建任务实例,并且可以设置任务的各种属性
TaskBuilder createTaskBuilder();
//将给定任务保存到持久数据存储。如果任务已存在于持久存储中,则会对其进行更新。保存新任务后,传递到此方法的任务实例将使用新创建的任务的id进行更新。
void saveTask(Task task);
// 指定的用户被指定为任务的受让人。与setAssignee(String,String)的区别在于,这里检查任务是否已经分配了用户。不检查标识组件是否知道该用户。
void claim(String taskId, String userId);
//使用空用户声明以取消声明任务的快捷方式
void unclaim(String taskId);
//在任务成功执行时调用
void complete(String taskId);
//当任务成功执行时调用,所需的任务参数由最终用户给定。
void complete(String taskId, Map<String, Object> variables);
// 当任务成功执行并且任务表单已提交时调用
// taskId:任务ID;formDefinitionId:表单id;outcome:已完成表单的结果,variables:已完成表单的值。
void completeTaskWithForm(String taskId, String formDefinitionId, String outcome, Map<String, Object> variables);
// 获取任务表单模型
FormInfo getTaskFormModel(String taskId);
//将给定任务的受让人更改为给定的userId。不检查标识组件是否知道该用户。
void setAssignee(String taskId, String userId);
//将此任务的所有权转移给另一个用户。不检查身份组件是否知道用户。
void setOwner(String taskId, String userId);
// 获取一个变量并搜索任务范围,如果可用,还搜索执行范围。
Object getVariable(String taskId, String variableName);
//所有给定variableNames的变量值都考虑了从给定任务范围(包括父范围)可见的所有变量。
Map<String, VariableInstance> getVariableInstances(String taskId, Collection<String> variableNames);
HistoryService
HistoryService 暴露Flowable引擎收集的所有历史数据。当执行流程时,引擎会保存许多数据(可配置),例如流程实例启动时间、谁在执行哪个任务、完成任务花费的事件、每个流程实例的执行路径,等等。这个服务主要提供查询这些数据的能力
HistoryService接口操作的表
- act_hi_actinst:历史节点表,存放流程实例运转的各个节点信息(包含开始、结束等非任务节点);
- act_hi_attachment:历史附件表,存放历史节点上传的附件信息(不常用);
- act_hi_comment:历史意见表;
- act_hi_detail:历史详情表,存储节点运转的一些信息(不常用);
- act_hi_identitylink:历史流程人员表,存储流程各节点候选、办理人员信息,常用于查询某人或部门的已办任务;
- act_hi_procinst:历史流程实例表,存储流程实例历史数据(包含正在运行的流程实例);
- act_hi_taskinst:历史流程任务表,存储历史任务节点;
- act_hi_varinst:流程历史变量表,存储流程历史节点的变量信息;
相关API
//创建一个新的程序化查询以搜索 HistoricProcessInstances。ProcessInstances 是活动实例
HistoricProcessInstanceQuery createHistoricProcessInstanceQuery();
// 创建一个新的程序化查询以搜索历史活动实例。
HistoricActivityInstanceQuery createHistoricActivityInstanceQuery();
// 创建一个新的程序化查询以搜索历史任务实例
HistoricTaskInstanceQuery createHistoricTaskInstanceQuery();
//创建一个新的程序化查询以搜索历史详细信息。
HistoricDetailQuery createHistoricDetailQuery();
// 创建一个用于执行原生 SQL 查询的 HistoricDetail 查询对象
NativeHistoricDetailQuery createNativeHistoricDetailQuery();
// 创建一个新的程序化查询以搜索历史变量实例。
//获取与指定任务相关的历史身份链接。历史身份链接包含了与任务相关的用户或者用户组的信息,比如任务的候选人、受让人等
HistoricVariableInstanceQuery createHistoricVariableInstanceQuery();
date:20244.9 开发查询当前角色的历史任务信息,获取历史变量问题:
起初通过taskserver去获取历史变量,发现不能获取,查看sql发现该方法是去访问ACT_RUN
的表格,此时并不是正在运行时的人物,当然查询不到。通过研究,在ACT_HI
中存在变量信息,根据API访问
// 查看任务 历史变量
List<HistoricVariableInstance> historicVariableInstances = historyService.createHistoricVariableInstanceQuery().processInstanceId(his.getProcessInstanceId()).list();
// 在historicVariableInstances中,value表示变量值 valueName 表示变量的key
Map<String, Object> variables = historicVariableInstances.stream()
.collect(Collectors.toMap(HistoricVariableInstance::getVariableName, HistoricVariableInstance::getValue));
approved = (String) variables.get("approved");
dataBO =(String) variables.get("formDataBO");
requestUser =(String) variables.get("requestName");
approvalComment =(String) variables.get("approvalComment");
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步