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
计时器定义:
- 过程是
starteble
和executable
- 定时器定义类型为
Cycle
,定时器定义为0 0 0 ? * * *
。
根据 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 启动一个进程并且根本不使用计时器启动事件。
我有一个 Camunda 进程,该进程每 15 分钟定期启动一次,该进程是使用 CRON 表达式配置的。我使用默认配置以默认 data source configuration.
连接到 MariaDBCamunda 进程 myProcess.bpmn
计时器定义:
- 过程是
starteble
和executable
- 定时器定义类型为
Cycle
,定时器定义为0 0 0 ? * * *
。
根据 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 启动一个进程并且根本不使用计时器启动事件。