Spring 使用 Camunda - 如果进程是通过 beans 配置的,则数据库不会在重启时更新

Spring with Camunda - DB is not updated upon restart if the process is configured through beans

我有一个 Camunda 进程,该进程每 15 分钟定期启动一次,该进程是使用 CRON 表达式配置的。我使用默认配置以默认 data source configuration.

连接到 MariaDB

Camunda 进程 myProcess.bpmn 计时器定义:

根据 The Job Executor documentation 我观察到此值存储在 ACT_RU_JOB table 的 REPEAT_ 列中。

SELECT ID_, REPEAT_ from act_ru_job;

--------------------------------------------------------
| ID_                                  | REPEAT_       |
--------------------------------------------------------
| 0d1f49da-83a8-11ea-a61b-98fa9b04dfaf | 0 0 0 ? * * * |
--------------------------------------------------------

使用 Camunda Modeler 在 myProcess.bpmn 中更改 CRON 表达式并重新启动应用程序更新了数据库中的这个值,流程编排器使用新值。

问题

一旦我通过 bean 从应用程序属性动态加载此值,就会加载属性中的新值,已记录,但不会存储在数据库中,因此 Camunda 可以工作与旧的。

application.properties 具有不同的随机值:process.timer: 1 2 3 ? * * *

@Slf4j
@Configuration
public class TimerConfiguration {

    @Value("${process.timer}") 
    private String timerExpression;

    @Bean
    public String timerExpression() {
        // the log truly logs 1 2 3 ? * * *
        log.info("Periodical timer expression has been configured to: {}", timerExpression);
        return timerExpression;
    }
}

Camunda 进程 myProcess.bpmn 计时器定义 (Link to the screen) 使用动态值作为计时器定义:

${timerConfiguration.timerExpression()}

问题

如何让Camunda将配置的数据与它使用的数据库同步?没有抛出异常,应用程序继续使用数据库中的旧配置。

SELECT ID_, REPEAT_ from act_ru_job;

查询returns旧值。当在 myProcess.bpmn 进程中手动设置 CRON 表达式时,该值会在重启后更新。

快速回答:当应用程序启动时(例如,部署流程),带有定时器启动事件的流程在流程引擎上注册......所以"timerExpression()"只被读取一次......

我还没有想出解决方法...除了重新部署 bpmn 以重新注册计时器...这会使基于表达式的计时器的概念过时。

一个非 bpmn 解决方案可能是使用一个普通的调度程序 bean,它只是通过 runtimeService API 启动一个进程并且根本不使用计时器启动事件。