Activiti BPM在Task中获取变量

时间:2012-12-14 14:55:00

标签: java bpm activiti

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

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

我知道有机会通过变量获取变量 processEngine.getTaskService().getVariable()

processEngine.getRuntimeService().getVariable()

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

3 个答案:

答案 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());
    }

}