2009-12-21 9 views
13

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

11

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.

7

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> 
+1

Funktioniert das gut mit Kontext-Shutdown und so weiter? –

+1

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

+0

Die Implementierung einer Federschnittstelle ist nicht in der Geist meiner ursprünglichen Antwort natürlich. – washley

2

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.