Ich verwende Springannotationen zum Konfigurieren von Controllern (@EnableWebMvc), Diensten (@service und @ComponentScan). In einem meiner Dienste habe ich eine Methode mit @ Async kommentiert und ich habe auch @EnableAsync in meiner Config-Klasse hinzugefügt. Wenn einer der MVC-Controller die Service-Methode aufruft, die mit @ Asynyn versehen ist, erwarte ich, dass der Controller sofort zurückkehrt, ohne auf die Beendigung der Service-Methode zu warten. Damit nicht. Wenn ich den Breakpoint in der Service-Methode einstelle, sehe ich, dass er tatsächlich in einem separaten Thread läuft, d. H. Der Stacktrace wird angezeigt dass es SimpleAsyncTaskExecutor wie unten konfiguriert verwendet.
Hier ist die Annotation in meiner Konfigurationsklasse wie
%Vor%Und hier sieht meine MVC-Controller-Methode aus wie
%Vor%Und die Service-Methode sieht so aus
%Vor%Warum kehrt der MVC-Controller nicht sofort zurück?
Ich schätze, dass Ihre EmailService-Bean aus zwei verschiedenen Kontexten eingebunden wird.
Diese Antwort von Ryan Stewart erklärt die Problem / Lösung im Detail.
Haben Sie andere Konfigurationen, die verwendet werden? Gibt es in Ihrer web.xml eine * -servlet.xml oder andere Servlets, die Ihren EmailService in den Root-Kontext bringen?
Haben Sie einen ContextLoaderListener oder ServletContextListener definiert? Vielleicht nehmen diese Ihren EmailService zusätzlich zum Komponentenscan auf.
Das Einschließen Ihres gesamten Quellbaums als Komponenten-Scan-Pfad erscheint verdächtig. Versuchen Sie, die Pfade einzuschränken, die Sie bei der Überprüfung Ihrer Komponente verwenden, um Ihren EmailService auszuschließen und zu sehen, ob er weiterhin in einem SimpleAsyncTaskExecutor ausgeführt wird. Wenn es ist, dann wissen Sie, dass es aus einem anderen Kontext stammt. Sobald Sie den anderen Kontext gefunden haben, können Sie ihn dort ausschließen und ihn zu Ihrem Komponenten-Scan oder EnableAsync in dem anderen Kontext hinzufügen.
Tags und Links java spring spring-mvc