Доступ к информации о переменной текущего экземпляра процесса из движка Camunda BPMN

Я хочу, чтобы вся информация об экземпляре запущенного процесса хранилась в базе данных H2 в таблице act_proc_in_ (например, время начала, время окончания, автор ..)

Я нахожусь в методе ExecutionListener (в классе, реализующем интерфейс JavaDelegate), откуда мне нужно пересылать информацию дальше.

Я знаю об интерфейсе RuntimeService с методом createExecutionQuery (), но во всех примерах, которые я видел, кажется, что он сопоставлен с каким-то классом сущности. Я не понимаю этого. Извините, но я новичок в движке Camunda BPM.

    public class ProcessRequestDelegate implements JavaDelegate { 
    private final static Logger LOGGER = Logger.getLogger("LOAN-REQUESTS"); 
    public void execute(DelegateExecution execution) throws Exception { LOGGER.info("Processing request by '"+execution.getVariable("customerId")+"'...");
    System.out.println(execution.getVariable("amount")); 
    int Amount= ((Double) execution.getVariable("amount")).intValue(); System.out.println("Amountis"+Amount);

    ProcessEngine processEngine = BpmPlatform.getDefaultProcessEngine();
    RuntimeService runtimeService = processEngine.getRuntimeService(); 

    ResulstSet rs= runtimeService.createExecutionQuery("What to write here?"); 
 while (rs.next()) {
         String author=rs.getString("AUTHOR");
            Date start = rs.getDate("START_TIME");
            int sales = rs.getInt("SALES");

} }
       

person Varda    schedule 20.05.2015    source источник
comment
Пожалуйста, отформатируйте свой вопрос правильно   -  person Stanislav Mekhonoshin    schedule 20.05.2015
comment
Надеюсь, это более читабельно? Прости за это.   -  person Varda    schedule 20.05.2015


Ответы (1)


Начиная с Camunda BPM 7.2 вы можете использовать метод execute.getProcessEngineServices () для доступа к engine services в классе делегата Java. Используйте HistoryService или RuntimeService для создания (Historic-) ProcessInstanceQuery, например

HistoryService historyService = execution.getProcessEngineServices().getHistoryService(); HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(execution.getProcessInstanceId()).singleResult();

Затем вы можете получить доступ к информации о HistoricProcessInstance.

Имейте в виду, что вы запрашиваете базу данных через эти службы. Данные, измененные в текущей транзакции, недоступны через службы до тех пор, пока транзакция не будет зафиксирована.

person Hawky4s    schedule 20.05.2015
comment
Когда я использовал .singleResult (), код генерировал исключение. Затем я получил данные в списке ‹HistoricProcessInstance› (чтобы проверить, получаю ли я что-нибудь вообще), и, как ни странно, размер списка равен 0. Интересно, как это могло быть? - person Varda; 21.05.2015
comment
Это означает, что процесс еще не сохранен в базе данных. Вы, вероятно, все еще находитесь в первой транзакции. См. [1] для описания того, что такое транзакции в контексте процесса и как вы можете на них повлиять. [1]: docs.camunda.org /7.2/guides/user-guide/ - person Hawky4s; 23.05.2015
comment
Большое спасибо, это сработало, изменив значения asyncbefore of servicetask на true. - person Varda; 08.06.2015