Wie wird eine geplante Aufgabe zur Laufzeit mit der Annotation EnableScheduling im Frühjahr neu gestartet?

Ich habe untersucht, wie ich die Häufigkeit eines Jobs zur Laufzeit mit Java 8 und spring ändern kann.Diese Frag war sehr nützlich, hat aber mein Problem nicht vollständig gelöst.

Ich kann jetzt das Datum konfigurieren, an dem der Auftrag als nächstes ausgeführt werden soll. Wenn aber die Verzögerung auf 1 Jahr eingestellt ist, muss ich 1 Jahr warten, bevor die neue Konfiguration berücksichtigt wird.

Meine Idee wäre, die geplante Aufgabe zu stoppen, wenn der Konfigurationswert geändert wird (also von einer anderen Klasse). Berechnen Sie dann das nächste Mal neu, wenn die Aufgabe ausgeführt werden soll. Vielleicht gibt es dafür einen einfacheren Weg.

Hier ist der Code, den ich bisher habe.

@Configuration
@EnableScheduling
public class RequestSchedulerConfig implements SchedulingConfigurer {

    @Autowired
    SchedulerConfigService schedulerConfigService;

    @Bean
    public RequestScheduler myBean() {
        return new RequestScheduler();
    }

    @Bean(destroyMethod = "shutdown")
    public Executor taskExecutor() {
        return Executors.newScheduledThreadPool(100);
    }

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(taskExecutor());
        taskRegistrar.addTriggerTask(
                new Runnable() {
                    @Override public void run() {
                        myBean().startReplenishmentComputation();
                    }
                },
                new Trigger() {
                    @Override public Date nextExecutionTime(TriggerContext triggerContext) {
                        Duration d = schedulerConfigService.getIntervalFromDB();
                        return DateTime.now().plus(d).toDate();
                    }
                }
        );
    }
}

Das wäre was ich gerne machen würde.

@RestController
@RequestMapping("/api/config/scheduler")
public class RequestSchedulerController {

    @Autowired
    ApplicationConfigWrapper applicationConfigWrapper;

    @RequestMapping("/set/")
    @ResponseBody
    public String setRequestSchedulerConfig(@RequestParam(value = "frequency", defaultValue = "") final String frequencyInSeconds){
        changeValueInDb(frequencyInSeconds);
        myJob.restart();
        return "Yeah";
    }

}

Antworten auf die Frage(6)

Ihre Antwort auf die Frage