[英]Update Cron expression in SpringBoot @Scheduled
我用@Scheduled 和一個硬編碼的 cron 表達式安排了大約 10 個工作,如下所示:
@Scheduled(cron = "* * 1 * * *")
public void testMethod(){
doSomething();
}
現在我希望能夠通過數據庫更新此 cron 表達式並在運行時重新安排特定作業。
有誰知道如何做到這一點?
謝謝
如果你想在運行時配置作業的調度,我認為你不能使用注解@Scheduled
。
您可以使用自己的調度程序代替Spring 文檔:
scheduler.schedule(task, new CronTrigger("0 15 9-17 * * MON-FRI"));
然后,如果您想更改配置,您可以取消調度並創建一個新的調度。
TaskScheduler
返回一個ScheduledFuture
,您應該將其保存在某處,並且可以使用cancel(...)
方法cancel(...)
它。
我認為@Scheduled 不支持這個功能(一定是有趣的實現)。 對於提前調度功能,您需要使用石英或其他調度程序解決方案。 我的回答基於 Quartz 解決方案:
@Component
class ReschedulerComponent{
@Autowired
private SchedulerFactoryBean schedulerFactoryBean;
public void reSchedule(){
Trigger oldTriger = schedulerFactoryBean.getScheduler().getTrigger("my_custom_trigger");
Trigger myNewTrigger = TriggerBuilder
.newTrigger()
.forJob(jobDetail) // Name of your job
.withIdentity("my_custom_trigger")
.startAt(myNewDATE)
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withMisfireHandlingInstructionFireNow())
.build();
schedulerFactoryBean.getScheduler().rescheduleJob(oldTriger.getKey(), myNewTrigger);
}
}
快速介紹: https : //docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/scheduling.html
如果您想配置作業的時間表,以便您不需要更改代碼,我建議您提取存儲在某些 configuration.properties 中的屬性中的值,然后在代碼中使用@Value
訪問它。
UPD:找到這個話題,也許你覺得它很有用Spring Scheduler 動態更改 cron 表達式
我認為你應該看看這個資源你可以以編程方式創建預定的作業。 因此,如果您使用@PostConstruct
注釋您的方法,它應該在應用程序啟動並在預定時間運行時選擇它
http://www.quartz-scheduler.org/api/2.2.1/org/quartz/impl/triggers/SimpleTriggerImpl.html
這可以通過在您的property place holder
指定cron expression
來完成,如下所述。 在@configuration
類中添加以下代碼。
@Bean
public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
PropertySourcesPlaceholderConfigurer properties = new PropertySourcesPlaceholderConfigurer();
properties.setLocation(new ClassPathResource("test.properties"));
return properties;
}
現在 test.properties 將在您的占位符中可用。 Test.properties 如下所示
variable.name.inside.properties= 00 39 05 * * *
然后在您的調度程序類中添加
@Scheduled(cron = "${variable.name.inside.properties}")
public void testMethod(){
doSomething();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.