Ich möchte Hintergrundprozesse parallel zu meiner spring-mvc Web-Anwendung ausführen. Ich brauche einen Weg, um beim Laden des Kontextes automatisch zu beginnen. Hintergrundprozess ist eine Klasse, die Runnable
implementiert. Hat Spring-Mvc einige Einrichtungen dafür?Wie Hintergrundprozess im Frühjahr Webapp erstellen?
Antwort
Spring verfügt über ein umfassendes Task-Ausführungs-Framework. Siehe relevant part of the docs.
Ich schlage vor, eine Spring Bohne in Ihrem Kontext zu haben, die, wenn sie initialisiert wird, Ihren Hintergrund Runnable
an eine SimpleAsyncTaskExecutor
Bohne übermittelt. Das ist der einfachste Ansatz, den Sie nach Belieben komplexer und leistungsfähiger gestalten können.
Ich würde weiter gehen und schauen Sie sich die Task-Scheduling-Dokumentation von Skaffman verlinkt, aber es gibt auch einen einfacheren Weg, wenn alles, was Sie wirklich tun wollen, ist ein Hintergrund-Thread zur Kontextinitialisierungszeit zu starten.
<bean id="myRunnableThingy">
...
</bean>
<bean id="thingyThread" class="java.lang.Thread" init-method="start">
<constructor-arg ref="myRunnableThingy"/>
</bean>
Als eine weitere Option kann man nun die Planungsfunktionen von Spring verwenden. Mit Spring 3 oder höher verfügt es über eine cron-ähnliche Annotation, mit der Sie Tasks so planen können, dass sie mit einer einfachen Annotation einer Methode ausgeführt werden. Es ist auch freundlich mit dem Autofahren.
In diesem Beispiel wird eine Aufgabe alle 2 Minuten mit einer anfänglichen Wartezeit (beim Start) von 30 Sekunden geplant. Die nächste Aufgabe wird 2 Minuten nach Abschluss der Methode ausgeführt. Wenn Sie möchten, dass es alle 2 Minuten genau ausgeführt wird, verwenden Sie stattdessen fixedInterval.
@Service
public class Cron {
private static Logger log = LoggerFactory.getLogger(Cron.class);
@Autowired
private PageService pageService;
@Scheduled(initialDelay = 30000, fixedDelay=120000) // 2 minutes
public void cacheRefresh() {
log.info("Running cache invalidation task");
try {
pageService.evict();
} catch (Exception e) {
log.error("cacheRefresh failed: " + e.getMessage());
}
}
}
Seien Sie sicher, auch @EnableAsync @EnableScheduling auf Ihre Anwendungsklasse hinzuzufügen, diese Funktion zu aktivieren.
- 1. Orika ClassCastException im Frühjahr Boot webapp
- 2. So erstellen Sie javax.mail.Session im Frühjahr config
- 3. Fehler Bohne im Frühjahr Boot Erstellen
- 4. Karte aus der Eigenschaftendatei im Frühjahr erstellen
- 5. Keine Bilder im Frühjahr MVC
- 6. Erstellen Sie einen Hintergrundprozess mit Taskleistensymbol
- 7. Wie Hintergrundprozess vom Systemfunktionsaufruf
- 8. Wie lade ich ein Bild nach/src/main/webapp/Theme/img im Frühjahr hoch
- 9. Wie neu Datenbank vor jedem Test im Frühjahr erstellen?
- 10. Wie behandelt DataIntegrityViolationException im Frühjahr?
- 11. Dynamische Formulare im Frühjahr
- 12. Verhindern, dass Hintergrundprozess im Dock angezeigt wird
- 13. ConversionService im Frühjahr
- 14. wie automatische Kontonr. im Frühjahr mvc
- 15. Erstellen einer eigenständigen Node.js WEBAPP
- 16. Dateispeicher im Frühjahr
- 17. Pfadattribut im Frühjahr
- 18. Log4j.properties im Frühjahr Boot
- 19. Testen @Scheduled im Frühjahr
- 20. Bean-Konfiguration im Frühjahr
- 21. Binding Annotation im Frühjahr
- 22. MessageInterpolator im Frühjahr
- 23. @Specializes im Frühjahr
- 24. Instantiierungsabhängigkeiten im Frühjahr
- 25. Vordefinierte Bohnen im Frühjahr Boot
- 26. Ausgabe im Frühjahr @pathvariable
- 27. aspectj im Frühjahr
- 28. SocketTimoutException im Frühjahr JDBC
- 29. Seltsamer NoSuchBeanDefinitionException im Frühjahr
- 30. Pfad zu WebContentFile im Frühjahr
Funktioniert das gut mit Kontext-Shutdown und so weiter? –
Das ist eine gute Frage, Herunterfahren könnte schwierig sein. Im Idealfall würden Sie ein 'interrupt()' gefolgt von einem 'join()' machen wollen. Leider glaube ich nicht, dass du zwei 'destroy-Methoden' haben kannst, also das Beste, was du tun kannst, ist 'destroy-method =" interrupt "'. Für ein ordnungsgemäßes Herunterfahren würde ich empfehlen, [Lifecycle] zu implementieren (http://docs.spring.io/spring/docs/4.1.0.BUILD-SNAPSHOT/javadoc-api/org/springframework/context/Lifecycle.html) oder [SmartLifecycle] (http://docs.spring.io/spring/docs/4.1.0.BUILD-SNAPSHOT/javadoc-api/org/springframework/context/SmartLifecycle.html) – washley
Die Implementierung einer Federschnittstelle ist nicht in der Geist meiner ursprünglichen Antwort natürlich. – washley