4

是否可以使用 TaskService 获取所有流程或任务变量:

processEngine.getTaskService.createTaskQuery().list();

我知道有机会通过 processEngine.getTaskService().getVariable()

或者

processEngine.getRuntimeService().getVariable()

但是上面的每个操作都进入数据库。如果我有 100 个任务的列表,我将对 DB 进行 100 个查询。我不想使用这种方法。有没有其他方法可以获取任务或流程相关的变量?

4

3 回答 3

5

不幸的是,没有办法通过“官方”查询 API 做到这一点!但是,您可以做的是编写一个自定义 MyBatis 查询,如下所述:

https://app.camunda.com/confluence/display/foxUserGuide/Performance+Tuning+with+custom+Queries (注意:文章中描述的所有内容也适用于裸 Activiti,您不需要 fox 引擎!)

这样,您可以编写一个查询,在一个步骤中选择任务和变量。在我的公司,我们使用了这个解决方案,因为我们遇到了完全相同的性能问题。

此解决方案的一个缺点是需要维护自定义查询。例如,如果您升级您的 Activiti 版本,您将需要确保您的自定义查询仍然适合数据库模式(例如,通过集成测试)。

于 2012-12-17T06:26:55.107 回答
1

如果不能像 elsvene 所说的那样使用 API,您可以自己查询数据库。Activiti 在数据库上有几个表。

您有act_ru_variable,当前运行的进程是否存储了变量。对于您已经完成的流程act_hi_procvariable。可能你可以在activiti userguide 中找到关于每个表的详细解释。

所以你只需要进行如下查询

SELECT *
FROM act_ru_variable
WHERE *Something*
于 2012-12-17T11:09:44.007 回答
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());
    }

}  
于 2013-06-18T09:02:03.403 回答