如何在 Camunda 中获取用户任务列表及其流程变量

问题描述 投票:0回答:2

我有一个要求,可以为用户分配数千个(1000 - 5000)个任务,这些任务在给定时间属于不同的流程实例(1000 - 5000 个相同的用户任务)实例。我有一个自定义任务列表屏幕,我需要加载所有任务及其基本信息(id、名称、流程实例 ID 等)以及每个任务的一些流程变量。

首先,我使用过滤器/列表 REST 服务,即 engine-rest/filter/{filter-id}/list 来获取具有流程变量的任务。 (我在 Camunda 任务列表中创建了一个过滤器)。但是,当存在超过 1000 个流程实例时,此 REST 服务需要永远返回。大约 2000 个流程实例花费了 7-8 分钟。也许是因为这个服务返回了很多我不需要的信息。

所以我决定使用 Camunda Java api 编写自己的 REST 服务。这就是我所做的-

List<Task> tasks = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();

 if(tasks != null && !tasks.isEmpty()){

 for(Task task : tasks){
 .....
 .....
 Map<String, Object> variables = taskService.getVariables(task.getId(), variableNames);
 .....
}}

这有效并且比过滤服务快得多。但对于大约 1000 个实例,大约需要 25 秒。 (我的服务器现在不是生产级,Tomcat Xms -1gb Xmx - 2gb)。

但我担心的是,这段代码在内部是否会访问数据库 1000 次(对于任务查询返回的每个任务)来获取变量?更糟糕的是,根据变量的数量,它是否会为每个变量查询数据库多次?我的意思是,对于 5 个变量,我们是否访问 DB 5000 次?

1)如果是这样,我有什么办法可以改进这项服务吗?就像我可以编写一个 NativeTaskQuery 来加入 act_ru_task、act_ru_process 和 act_ru_variable 表来获取我需要的数据吗?这是正确的方法吗? 2)Camunda 中是否有任何内置缓存可以提供帮助?

预先感谢您的帮助。

camunda
2个回答
0
投票

您可以为此使用自定义查询。编写您的原生 sql 查询并添加 mybatis 映射。此示例解释了这个概念:https://github.com/camunda-consulting/code/tree/master/snippets/custom-queries


0
投票

我通过下面的查询直接从SQL获取任务有效变量:

select  
va.PROC_INST_ID_ as ProcessInstanceId
,va.NAME_ as VarName
,va.TEXT_ as VarValue
from [Camunda].[dbo].[ACT_RU_VARIABLE] va 
left join   [Camunda].[dbo].ACT_RU_EXECUTION ex with (nolock) on ex.ID_ = 
va.EXECUTION_ID_
left join  [Camunda].[dbo].ACT_RU_TASK ta  with (nolock) on ex.ID_ = 
ta.EXECUTION_ID_ 
where  ta.ID_ = 'xxxxx-xxxx-xx.....'   -- TaskId
and not ex.ID_ is null
group by va.PROC_INST_ID_,va.NAME_,va.TEXT_ 
© www.soinside.com 2019 - 2024. All rights reserved.