是否可以使用TaskService获取所有流程或任务变量:
进程引擎。获取任务服务。创建任务查询()。列表();
我知道有机会通过process Engine. getTaskService().getVariable()
获取变量
或
进程引擎。获取运行时服务()。获取变量()
但是上面的每个操作都去数据库。如果我有100个任务的列表,我会向DB进行100次查询。我不想使用这种方法。还有其他方法可以获得任务或过程相关的变量吗?
不幸的是,没有办法通过“官方”查询API做到这一点!但是,您可以做的是编写一个自定义的MyBatis查询,如下所述:
https://app.camunda.com/confluence/display/foxUserGuide/Performance使用自定义查询进行调优(注意:文章中描述的所有内容也适用于裸Activiti,您不需要fox引擎!)
这样您就可以编写一个查询,一步选择任务和变量。在我的公司,我们使用这个解决方案,因为我们有完全相同的性能问题。
此解决方案的缺点是需要维护自定义查询。例如,如果升级Activiti版本,则需要确保自定义查询仍然适合数据库模式(例如,通过集成测试)。
如果不能像elsvene所说的那样使用API,您可以自己查询数据库。Activiti在数据库上有几个表。
您有act_ru_variable
,当前运行的进程是否存储了变量。对于已经完成的进程,您有act_hi_procvariable
。您可能可以在Activiti用户指南中找到有关每个表上内容的详细说明。
所以你只需要做这样的查询
SELECT *
FROM act_ru_variable
WHERE *Something*
以下Test将一个值对象(Person)发送到一个流程,该流程只是添加了一些跟踪信息以供演示。
我也遇到了同样的问题,在执行服务后获取value对象以在我的测试中进行一些验证。
以下代码显示了执行完成后任务变量的执行和收集。
@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());
}
}