Spring Boot: Verwendung eines @ Service in der Ausführung des Quartz-Jobs

8

Da ich in einer Anwendung von einer klassischen Spring-Webanwendung (in einem Tomcat-System) in eine Spring-Boot-Anwendung (V1.2.1) umgewandelt wurde, stehe ich vor dem Problem, dass die quarzbasierten geplanten Jobs nicht mehr funktionieren.

Ich plane diese Quartz-Jobs wie folgt:

%Vor%

ScheduledActionRunner :

%Vor%

ScheduleService ist ein klassischer Spring-Service, der Daten aus Hibernate holt. Wie ich oben sagte, funktionierte das gut, bis ich nach Spring Boot zog.

Als ich diesen Code mit der klassischen Spring-Anwendung implementiert habe, hat SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this); den Trick gemacht, um den Autowire des Dienstes zu übernehmen.

Was ist erforderlich, damit dies in der Spring Boot-Umgebung erneut funktioniert?

Bearbeiten:

Am Ende entschied ich mich, von der Verwendung von Quartz zugunsten von Spring's ThreadPoolTaskScheduler wegzukommen. Der Code wurde stark vereinfacht und funktioniert wie erwartet.

    
yglodt 25.01.2015, 09:11
quelle

2 Antworten

11

SpringBeanAutowiringSupport verwendet den Webanwendungskontext, der in Ihrem Fall nicht verfügbar ist. Wenn Sie eine Feder im Quarz benötigen, sollten Sie die Quarzfeder verwenden, die vom Frühling zur Verfügung gestellt wird. Dadurch erhalten Sie vollen Zugriff auf alle verwalteten Beans. Weitere Informationen finden Sie im Quartz-Bereich unter spring docs unter Ссылка . Siehe auch folgendes Beispiel für die Verwendung von Quarz mit Feder Bohnen. Beispiel basiert auf Ihrem Code. So können Sie das erste Code-Snippet (wo die Quarz-Initialisierung durchgeführt wird) mit folgenden Alternativen ändern.

Erstellen Sie eine Jobdetail-Factory

%Vor%

Erstellen Sie die Trigger-Factory

%Vor%

Und schließlich erstellen Sie die SchedulerFactory

%Vor%     
Babl 25.01.2015, 11:26
quelle
9

Meine Antwort stimmt nicht vollständig mit Ihrer Frage überein, aber Spring enthüllt Ihnen eine weitere Fähigkeit - Cron-Ausdruck-basierten Scheduler auf jedem Dienst zu starten.

Mit Spring.Boot können Sie Ihre Anwendung so konfigurieren, dass sie den Scheduler durch einfaches Platzieren

verwendet %Vor%

Danach einfach folgende Annotation auf public (!) Methode von @Service

setzen %Vor%     
Dewfy 28.01.2015 16:44
quelle