簡體   English   中英

在 SpringBoot @Scheduled 中更新 Cron 表達式

[英]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注釋您的方法,它應該在應用程序啟動並在預定時間運行時選擇它

https://www.programcreek.com/java-api-examples/index.php?api=org.quartz.impl.triggers.SimpleTriggerImpl

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM