Значение переменной настройки спринга из application.properties в переменной контекста процесса

Здравствуйте. Подскажите, пожалуйста, нужно сделать значение длительности таймера настраиваемым в процессе. Предлагаю использовать для этого application.properties спринговый по типу timer1.duration=1M.
В доке нашел, что можно установить длительность таймера из переменной процесса


${duration}


Внимание, вопрос. Как без лишнего джава кода, без всяких прослоек, только в самом процессе сделать так, чтобы зачитывались настройки таймера?
Что нужно написать, какой квадратик вставить и что там написать в нем?
Нигде не нашел. Может есть еще более интересный вариант настроек таймеров? Например, использовать таблицы DMN? Но как прочитать в процессе значение DMN по критериям? Без дополнительного кода в джаве?

Добрый день!

Эта задача состоит из двух.

  1. Пересчитать настройки из applicationProperties. Это можно сделать разными способами.
    Подробнее можно почитать тут: https://www.baeldung.com/spring-reloading-properties

  2. Вторая задача - заставить 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

Вот именно так и указывать :slight_smile:

Здравствуйте. А можно сделать так: задеплоить dmn таблицу типа название таймера - значение и как-то без кода Java сразу заюзать dmn таблицу внутри процесса через какие-то стандартные бины? Идея здесь такая, чтобы не использовать код джава напрямую, не писать самописные бины, которые нужно будет потом поддерживать.