【发布时间】:2015-12-18 00:09:26
【问题描述】:
我有一个要求,可以在给定时间为用户分配数千个 (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)。
但我担心的是,这段代码在内部是否会命中 DB 1000 次(对于 taskquery 返回的每个任务)以获取变量?更糟糕的是,取决于变量的数量,它是否会为每个变量多次查询数据库?我的意思是对于 5 个变量,我们是否达到了 DB 5000 次?
1) 如果是这样,我有什么办法可以改进这项服务吗?就像我可以编写一个 NativeTaskQuery 来加入 act_ru_task、act_ru_process 和 act_ru_variable 表来获取我需要的数据吗?那是正确的方法吗? 2) Camunda 中没有任何内置缓存可以提供帮助吗?
提前感谢您的帮助。
【问题讨论】:
标签: camunda