我有一个要求,即可以在给定时间为用户分配数千(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次(对于taskquery返回的每个任务)来获取变量?更糟糕的是仍然取决于变量的数量,它是否为每个变量多次查询数据库?我的意思是5个变量是我们击中DB 5000次?
1)如果是这样,有什么方法可以改善这项服务吗?就像我可以编写一个NativeTaskQuery,我加入了act_ru_task,act_ru_process&amp; act_ru_variable表来获取我需要的数据?这是正确的方法吗? 2)在Camunda中是否有任何可以帮助的内置缓存?
提前感谢您的帮助。
答案 0 :(得分:0)
您可以为此使用自定义查询。编写您的本机SQL查询并添加mybatis映射。这个例子解释了这个概念:https://github.com/camunda-consulting/code/tree/master/snippets/custom-queries