我有大约10个与@Scheduled一起安排的工作和一个硬编码的cron表达式:
@Scheduled(cron = "* * 1 * * *")
public void testMethod(){
doSomething();
}
现在我希望能够通过数据库更新此cron表达式并在运行时重新安排特定作业。
有谁知道怎么做?
由于
答案 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
注释您的方法,它应该在应用程序启动并在预定时间运行时选择它
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