Здравствуйте. Подскажите, пожалуйста, нужно сделать значение длительности таймера настраиваемым в процессе. Предлагаю использовать для этого application.properties спринговый по типу timer1.duration=1M.
В доке нашел, что можно установить длительность таймера из переменной процесса
${duration}
Внимание, вопрос. Как без лишнего джава кода, без всяких прослоек, только в самом процессе сделать так, чтобы зачитывались настройки таймера?
Что нужно написать, какой квадратик вставить и что там написать в нем?
Нигде не нашел. Может есть еще более интересный вариант настроек таймеров? Например, использовать таблицы DMN? Но как прочитать в процессе значение DMN по критериям? Без дополнительного кода в джаве?
Добрый день!
Эта задача состоит из двух.
-
Пересчитать настройки из applicationProperties. Это можно сделать разными способами.
Подробнее можно почитать тут: https://www.baeldung.com/spring-reloading-properties -
Вторая задача - заставить Camunda пересчитать таймер при изменении значения переменных процесса. Если я правильно помню, с этим были определенные боли.
Пример. Есть Boundary Timer Event. По каким-то причинам менялась плановая дата (происходило изменение значения переменной процесса). После этого выполнялся вот такой код (делегатом или листнером).
ManagementService managementService = delegateExecution
.getProcessEngineServices().getManagementService();
List<Job> timers = managementService
.createJobQuery()
.processInstanceId(delegateExecution.getProcessInstanceId())
.timers().list();
if (!timers.isEmpty()) {
log.debug("Found active jobs. Due date will be recalculated");
for (Job timer : timers)
{
managementService.recalculateJobDuedate(timer.getId(), true);
log.debug(String.format("Job id: %s. Definition id: %s. New DueDate is: %s%n",
timer.getId(),
timer.getJobDefinitionId(),
timer.getDuedate()));
}
} else {
log.debug("No active jobs for due date update");
}
Что ваш таймер из себя представляет? Это start, intermediate или boundary event? Дело в том, что значение таймера будет устанавливаться:
- Для boundary или intermediate) - в момент создания его экземпляра (когда токен добежит до соответствующего элемента
- Для start event - в момент развертывания описания процесса.
А варианты предоставления значения могут быть такие:
- Статическое значение в формате ISO8601
- Переменная процесса
- Вызов бина или метода Spring ( например applicationService.getPlannedDate()). DMN таким образом тоже можно использовать:
decisionService.evaluateDecisionByKey(myDmnKey).variables(myVars).evaluate().getSingleResult();
Вот еще почитать про таймеры:
Да, у меня эти.
Пересчет текущих не требуется. Те экземпляры процессов, которые встали на старых значениях - путь на них и дорабатывают. А для новых - действуют новые настройки.
А вызов бина прям внутри определения таймера?
Какой синтаксис для него? Нужно указать прям в камунда моделере TimerDefinition. К примеру:
applicationService.getPlannedDate()
Так нужно вызовы бинов в соответствии с синтаксисом вызывать?
boundaryEvent id=“escalationTimer” cancelActivity=“true” attachedToRef=“firstLineSupport”
${applicationService.getPlannedDate()}
/boundaryEvent
Здравствуйте. А можно сделать так: задеплоить dmn таблицу типа название таймера - значение и как-то без кода Java сразу заюзать dmn таблицу внутри процесса через какие-то стандартные бины? Идея здесь такая, чтобы не использовать код джава напрямую, не писать самописные бины, которые нужно будет потом поддерживать.