Ich habe eine Spring-Boot-Anwendung, die eine Orchestration-Service für mehrere andere Prozesse, die wir auslösen möchten, wird. Ich habe es derzeit eingerichtet mit Spring Scheduling ziehen Cron dynamisch aus einer Datenbank. Ich warf eine Rest-Methode ein, um den Prozess auszulösen, um neue Cron-Informationen aus der Datenbank zu ziehen. Diese Logik funktioniert alle korrekt. Das einzige "Problem" ist, dass es die neuen Cron-Informationen erst beim nächsten geplanten Lauf verwendet, der zur eigentlichen Frage kommt. Gibt es eine Möglichkeit, den aktuellen Trigger zu unterbrechen und einen erneut mit den aktualisierten Cron-Informationen zu planen. Hier ist die Anwendung als Referenz:Interrupt Feder Scheduler Aufgabe vor dem nächsten Aufruf
package com.bts.poc;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
@SpringBootApplication
@EnableScheduling
@RestController
@RequestMapping("/APSCommon/Scheduling")
public class Application implements SchedulingConfigurer {
@Autowired
private DynamicCron dynamicCron;
@Autowired
PropertyManager propertyManager;
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class);
}
private String cronConfig() {
String cronTabExpression = propertyManager.getProperty("COMPANY", "JOB_NAME","CRON_EXPRESSION");
return cronTabExpression;
}
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.addTriggerTask(new Runnable() {
@Override
public void run() {
dynamicCron.runJob();
}
}, new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
String cron = cronConfig();
CronTrigger trigger = new CronTrigger(cron);
Date nextExec = trigger.nextExecutionTime(triggerContext);
DynamicCron.cronExpression = cron;
return nextExec;
}
});
}
@RequestMapping(value = "/reloadScheduling", method = RequestMethod.GET)
public String reloadScheduling() {
PropertyManager.setResetProperties(true);
return "schedules will be altered next run";
}
}
Löst das dein Problem? http://StackOverflow.com/a/13869342/6737860 –
Es gibt keinen Weg, den ich gefunden habe, wo ich das ScheduledFuture bekommen kann, wenn ich den ScheduledTaskRegistrar plane. Ich werde es ein wenig genauer betrachten und aktualisieren. –