Ich versuche, eine Aufgabe mit einer festen Rate auszuführen, indem ich die @Scheduled-Annotation in der Java-Quelle verwende. Es scheint jedoch, dass Spring standardmäßig keine festeRate-Aufgabe mit einer festen Rate ausführt, wenn die Aufgabe langsamer als die Rate ist. Gibt es eine Einstellung, die ich zu meiner Federkonfiguration hinzufügen kann, um dieses Verhalten zu ändern?Wie können Sie Spring so konfigurieren, dass überlappende FixedRate-Tasks ausgeführt werden?
Beispiel:
@Service
public class MyTask{
@Scheduled(fixedRate = 1000)
public void doIt(){
// this sometimes takes >1000ms, in which case the next execution is late
...
}
}
ich habe eine Behelfslösung, aber es scheint, weniger als ideal. im Grunde genommen, ich ersetzen Sie einfach den Standard-Single-Thread-Vollstrecker mit einem Thread-Pool, dann habe ich ein geplantes Verfahren zur Herstellung eines Asynchron-Methode aufrufen, da die @Async Annotation parallele Ausführung ermöglicht:
@Service
public class MyTask{
@Async
public void doIt(){
// this sometimes takes >1000ms, but the next execution is on time
...
}
}
@Service
public class MyTaskScheduler{
...
@Scheduled(fixedRate = 1000)
public void doIt(){
myTask.doIt();
}
}
@Configuration
@EnableScheduling
@EnableAsync
public class MySpringJavaConfig{
@Bean(destroyMethod = "shutdown")
public Executor taskScheduler() {
return Executors.newScheduledThreadPool(5);
}
}
langweiligen Details meiner realen Welt Szenario: In meinem Produktionscode habe ich eine Aufgabe, die abhängig von der aktuellen Auslastung zwischen 10ms und 10 Minuten dauert. Idealerweise möchte ich alle 1000ms einen neuen Thread aus dem Pool erfassen, sodass die Anzahl der gleichzeitigen Threads mit der Arbeitslast zunimmt. Natürlich habe ich eine Obergrenze für Threads (neben anderen Kontrollen), um zu verhindern, dass die Dinge außer Kontrolle geraten.
i die Referenzen zu schätzen wissen, und untersuche die SchedulingConfigurer und cron Muster basierte Arbeitsplätze. das sagte, ich stimme nicht mit Ihrer Interpretation von "nachher" und "sukzessive" überein, und möchte eine Lösung (wie peinlich), die mein Ziel erreicht. Daher möchte ich noch etwas länger warten, bevor ich diese Antwort in der Hoffnung akzeptiere, dass jemand mit einer speziellen funktionalen Federkonfiguration aufwarten kann. –