是否可以使用TaskService获取所有进程或任务变量:
processEngine.getTaskService.createTaskQuery().list();
我知道有机会通过变量获取变量
processEngine.getTaskService().getVariable()
或
processEngine.getRuntimeService().getVariable()
但上面的每个操作都进入数据库。如果我有100个任务的列表,我将向DB提出100个查询。我不想使用这种方法。 有没有其他方法来获取任务或过程相关的变量?
答案 0 :(得分:5)
不幸的是,通过“官方”查询API无法做到这一点!但是,您可以执行的操作是编写自定义MyBatis查询,如下所述:
https://app.camunda.com/confluence/display/foxUserGuide/Performance+Tuning+with+custom+Queries (注意:文章中描述的所有内容也适用于裸体Activiti,你不需要狐狸引擎!)
通过这种方式,您可以编写一个查询,在一个步骤中选择任务以及变量。在我的公司,我们使用了这个解决方案,因为我们遇到了完全相同的性能问题。
此解决方案的缺点是需要维护自定义查询。例如,如果升级Activiti版本,则需要确保自定义查询仍然适合数据库架构(例如,通过集成测试)。
答案 1 :(得分:1)
如果无法像elsvene所说的那样使用API,您可以自己查询数据库。 Activiti在数据库上有几个表。
您有act_ru_variable
,当前正在运行的进程存储变量。对于已完成的流程,您有act_hi_procvariable
。您可以在activiti用户指南中找到每张桌子上的内容的详细说明。
所以你只需要进行像
这样的查询SELECT *
FROM act_ru_variable
WHERE *Something*
答案 2 :(得分:0)
以下测试,将一个值对象(Person)发送到一个只添加一些跟踪信息进行演示的进程。
我遇到了同样的问题,在执行服务后获取值对象,以便在我的测试中进行一些验证。
以下代码显示执行完成后执行和收集任务变量。
@Test
public void justATest() {
Map<String, Object> inVariables = new HashMap<String, Object>();
Person person = new Person();
person.setName("Jens");
inVariables.put("person", person);
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("event01", inVariables);
String processDefinitionId = processInstance.getProcessDefinitionId();
String id = processInstance.getId();
System.out.println("id " + id + " " + processDefinitionId);
List<HistoricVariableInstance> outVariables =
historyService.createHistoricVariableInstanceQuery().processInstanceId(id).list();
for (HistoricVariableInstance historicVariableInstance : outVariables) {
String variableName = historicVariableInstance.getVariableName();
System.out.println(variableName);
Person person1 = (Person) historicVariableInstance.getValue();
System.out.println(person1.toString());
}
}