在SpringBoot @Scheduled中更新Cron表达式

时间:2017-11-10 10:27:47

标签: java spring scheduled-tasks

我有大约10个与@Scheduled一起安排的工作和一个硬编码的cron表达式:

@Scheduled(cron = "* * 1 * * *")
public void testMethod(){
    doSomething();
}

现在我希望能够通过数据库更新此cron表达式并在运行时重新安排特定作业。

有谁知道怎么做?

由于

5 个答案:

答案 0 :(得分:5)

如果要在运行时配置作业的计划,我认为您不能使用注释override func viewDidLoad() { super.viewDidLoad() set = shuffledQuiz([[Quiz.quizzes[currentTopicIndex].plist]]) quiz = set.objectEnumerator() pickQuestion() } func shuffledQuiz(_ name: [[NSArray]]) -> NSArray{ if currentSetIndex < name.count { return name[currentSetIndex].shuffled() as NSArray } return NSArray()} func pickQuestion() { if let quiz = quiz?.nextObject() as? NSArray { print(quiz) let questionLabel: [String] = quiz.value(forKeyPath: "question") as! NSArray as! [String] print(questionLabel) self.questionLabel.text = questionLabel.description let correctAnswer: [Int] = quiz.value(forKey: "Answer") as! NSArray as! [Int] print(correctAnswer) let answers = quiz.value(forKeyPath: "options") as! NSArray print(answers) for i in 0..<answersButtons.count { answersButtons[i].setTitle((answers[i] as AnyObject).localizedName, for: .normal) } remainingQuestionsLabel.text = "\(set.index(of: quiz) + 1)/\(set.count)" } else { endOfQuestionsAlert() } }

您可以使用自己的日程安排程序,而不是 Spring documentation

@Scheduled

然后,如果要更改配置,可以取消计划并创建一个新计划。

TaskScheduler返回ScheduledFuture您应该保存的地方,可以使用cancel(...)方法取消。

答案 1 :(得分:0)

如果要配置作业的计划,以便不需要更改代码,我建议您提取存储在某些configuration.properties中的属性值,然后使用{在代码中访问它{1}}。

UPD:发现这个话题,也许你觉得它很有用 Spring Scheduler change cron expression dynamically

答案 2 :(得分:0)

我认为你应该看看这个资源 您可以以编程方式创建预定作业。因此,如果您使用@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

答案 3 :(得分:0)

可以通过在cron expression中指定property place holder来完成此操作,如下所述。在@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();
}

答案 4 :(得分:0)

我认为@Scheduled不支持这个功能(必须是有趣的实现)。对于高级调度功能,您需要使用石英或其他调度程序解决方案。我的回答是基于Quartz解决方案: @零件     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