Activiti BPM получает переменные в задаче

можно ли получить все переменные процесса или задачи с помощью TaskService:

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

Я знаю, что есть возможность получить переменные через processEngine.getTaskService().getVariable()

or

processEngine.getRuntimeService().getVariable()

но каждая из вышеперечисленных операций отправляется в базу данных. Если у меня есть список из 100 задач, я сделаю 100 запросов к БД. Я не хочу использовать этот подход. Есть ли другой способ получить переменные, связанные с задачей или процессом?


person Timofei    schedule 14.12.2012    source источник
comment
Я не уверен, что есть способ сделать это...   -  person rptmat57    schedule 14.12.2012


Ответы (3)


К сожалению, через «официальный» API запросов это сделать невозможно! Однако вы можете написать собственный запрос MyBatis, как описано здесь:

https://app.camunda.com/confluence/display/foxUserGuide/Performance+Tuning+with+custom+Queries (Примечание: все описанное в статье работает и для голого Activiti, для этого движок fox не нужен!)

Таким образом, вы можете написать запрос, который выбирает задачи вместе с переменными за один шаг. В моей компании мы использовали это решение, поскольку у нас была точно такая же проблема с производительностью.

Недостатком этого решения является необходимость поддержки пользовательских запросов. Например, если вы обновляете свою версию Activiti, вам нужно будет убедиться, что ваш пользовательский запрос по-прежнему соответствует схеме базы данных (например, с помощью интеграционных тестов).

person elsvene    schedule 17.12.2012
comment
пожалуйста, не могли бы вы отправить мне код, поскольку опубликованная ссылка ограничена определенными пользователями - person user3213240; 17.10.2018

Если невозможно использовать API, как говорит elsvene, вы можете сами запросить базу данных. В базе данных Activiti есть несколько таблиц.

У вас есть act_ru_variable, где текущие процессы хранят переменные. Для уже готовых процессов у вас есть act_hi_procvariable. Вероятно, вы можете найти подробное объяснение того, что находится на каждой таблице в руководстве пользователя activiti.

Так что вам просто нужно сделать запросы, как

SELECT *
FROM act_ru_variable
WHERE *Something*
person dgmora    schedule 17.12.2012

Следующий тест отправляет объект-значение (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());
    }

}  
person beagle    schedule 18.06.2013
comment
URL-адрес статьи не является общедоступным, не могли бы вы опубликовать соответствующую информацию по ссылке в своем ответе?app.camunda.com/confluence/display/foxUserGuide/ . От пользователя stackoverflow.com/users/4966492/somy (у которого недостаточно представителей для комментариев): - person Kmeixner; 02.06.2015