Ich habe die Anforderung, einen Batch-Job in einem festen Intervall auszuführen und die Zeit dieses Batch-Jobs zur Laufzeit ändern zu können. Dazu stieß ich auf @Scheduled Annotation, die im Rahmen von Spring zur Verfügung gestellt wurde. Aber ich bin mir nicht sicher, wie ich den Wert von fixedDelay zur Laufzeit ändern würde. Ich habe etwas gegoogelt, aber nichts Nützliches gefunden.So ändern Sie Spring's @Scheduled fixedDelay zur Laufzeit
Antwort
Sie können eine Trigger
verwenden, um die nächste Ausführungszeit dynamisch festzulegen. Siehe meine Antwort hier:
Scheduling a job with Spring programmatically (with fixedRate set dynamically)
AFAIK die Spring API lässt Sie nicht auf die Interna zugreifen, die Sie brauchen, um den Trigger zu ändern. Aber Sie könnten stattdessen manuell konfigurieren, um die Bohnen:
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="jobDetail" />
<property name="startDelay" value="10000" />
<property name="repeatInterval" value="50000" />
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="simpleTrigger" />
</list>
</property>
</bean>
Dann dokumentiert wie in SchedulerFactoryBean:
Für die dynamische Registrierung von Arbeitsplätzen zur Laufzeit, diese SchedulerFactoryBean eine Bohne Bezug auf verwendet die direkten Zugriff auf die bekommen Quartz Scheduler (
org.quartz.Scheduler
). Auf diese Weise können Sie neue Jobs und Trigger erstellen sowie den gesamten Scheduler steuern und überwachen.
Im Frühjahr Boot, direkt eine Anwendung Eigenschaft nutzen kann!
Zum Beispiel:
@Scheduled(fixedDelayString = "${my.property.fixed.delay.seconds}000")
private void process() {
// your impl here
}
Beachten Sie, dass Sie auch einen Standardwert haben, falls können die Eigenschaft nicht definiert ist, zB einen Standardwert von „60“ haben (Sekunden):
@Scheduled(fixedDelayString = "${my.property.fixed.delay.seconds:60}000")
Andere Dinge, die ich entdeckt:
- das Verfahren nichtig muss
- die Methode keine Parameter
- das Verfahren haben müssen möglicherweise
private
sein Ich fand private
Sichtbarkeit praktisch bedienen zu können, und verwendet es auf diese Weise:
@Service
public class MyService {
public void process() {
// do something
}
@Scheduled(fixedDelayString = "${my.poll.fixed.delay.seconds}000")
private void autoProcess() {
process();
}
}
Being private
kann die geplante Methode lokal für Ihren Dienst sein und nicht Teil der API Ihres Dienstes werden.
Auch dieser Ansatz ermöglicht es der process()
-Methode, einen Wert zurückzugeben, der eine @Scheduled
-Methode möglicherweise nicht. Zum Beispiel können Sie Ihre process()
Methode wie folgt aussehen:
public ProcessResult process() {
// do something and collect information about what was done
return processResult;
}
einige Informationen darüber zu geben, was bei der Verarbeitung geschah.
Danke, 'fixedDelayString' ist das, was ich gesucht habe – prettyvoid
Große Antwort. Funktioniert wie beschrieben. – flash
@Bohemain Danke für die Lösung, aber wie wird das FixedDelay zur Laufzeit aktualisiert? –
- 1. Spring @Scheduled fixedDelay funktioniert nicht wie erwartet
- 2. So ändern Sie die Ansicht zur Laufzeit
- 3. So ändern Sie die Dateierweiterung zur Laufzeit
- 4. So testen Sie Spring @Scheduled
- 5. So ändern Sie die Sprache zur Laufzeit ohne Layout-Probleme
- 6. So ändern Sie das aktuelle Design zur Laufzeit in Android
- 7. So ändern Sie den Speicherort der Seite zur Laufzeit
- 8. WPF + PRISM So ändern Sie die Region zur Laufzeit
- 9. ändern Etikettenposition zur Laufzeit
- 10. Schriftart ändern zur Laufzeit
- 11. Ändern Sie das Gebietsschema zur Laufzeit?
- 12. Ändern Sie das Thema zur Laufzeit
- 13. C++ Ressourcen zur Laufzeit ändern
- 14. So erstellen Sie multi_array :: index_gen zur Laufzeit
- 15. So verwalten Sie mehrere pageIndicator zur Laufzeit
- 16. ändern UIButton Klasse zur Laufzeit
- 17. Ändern von Code zur Laufzeit
- 18. Ändern von App.config zur Laufzeit
- 19. Frühling @Scheduled injizieren Verzögerungszeit
- 20. Ändern Anwendungsleiste Buttonicon zur Laufzeit
- 21. Ändern der Datensatzverbindungszeichenfolge zur Laufzeit
- 22. Ändern von LSApplicationQueriesSchemes zur Laufzeit
- 23. JVM-Flags zur Laufzeit ändern
- 24. Ändern injizierten Objekt zur Laufzeit
- 25. Ändern Sie Verbindungszeichenfolge und laden Sie app.config zur Laufzeit
- 26. Android, wie die Anwendungssprache zur Laufzeit ändern
- 27. So stellen Sie die Sprache des iPhone zur Laufzeit ein
- 28. Ändern der Größe von DialogFragment zur Laufzeit
- 29. Erstellen Sie usercontrol zur Laufzeit
- 30. Windows Forms: Ändern Anwendung Hauptfenster zur Laufzeit
Ich sehe Sie die beste Antwort akzeptiert, aber ich sehe immer noch, es gab einige ungelöste Probleme. Wurde das NPE-Problem behoben? Ist es möglich, dass Sie die gesamte Lösung dafür bereitstellen?Prost – despot
Mögliche Duplikate von [Einen Job mit Spring programmgesteuert einplanen (wobei fixedRate dynamisch gesetzt wird)] (http://stackoverflow.com/questions/14630539/slaming-a-job-with-spring-programmatical-with-fixedrate-set- dynamisch) –