Ich verwende Spring-Anmerkungen für die Konfiguration von Controllern (@EnableWebMvc), Dienste (@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 Unterbrechungspunkt in der Service-Methode einstelle, sehe ich, dass er tatsächlich in einem separaten Thread läuft, d. H. Der Stacktrace zeigt , dass er SimpleAsyncTaskExecutor verwendet, wie ich unten konfiguriert habe. HierSpring MVC-Controller kehrt nicht sofort beim Aufruf von @ Async-Methode zurück
ist die Anmerkung in meiner Konfiguration Klasse sieht aus wie
@Configuration
@EnableWebMvc
@EnableScheduling
@ComponentScan(basePackages = "com.mypackage")
@EnableAsync
public class WebApplicationConfig extends WebMvcConfigurerAdapter implements AsyncConfigurer {
...
...
@Override
public Executor getAsyncExecutor() {
SimpleAsyncTaskExecutor executor = new SimpleAsyncTaskExecutor("SimpleExecutor-");
executor.setConcurrencyLimit(props.getIntegerProperty(SysProps.EMAIL_SENDER_CONCURRENT_THREAD_LIMIT));
return executor;
}
Und hier ist meine MVC Controller-Methode wie
@Autowired
private EmailService emailService;
@ResponseStatus(value = HttpStatus.CREATED)
@RequestMapping(value = "/asset/{assetId}/slideshare/email", method = RequestMethod.POST, produces = JSON_UTF8)
@ResponseBody
@ApiResponseObject
public Link createAndEmailSlideShareLink(@PathVariable final String assetId,
@RequestParam(value = "email") final String email,
@RequestParam(value = "message", required = false) final String message,
final HttpServletRequest request) {
Link link = linkService.createLink()
emailService.sendSlideShareAssetEmail(user,link...
return link;
}
aussieht und die Service-Methode sieht wie folgt aus
@Async
public void sendSlideShareAssetEmail(User user, String email, String msg, String link, Asset asset) {
Warum kehrt der MVC-Controller nicht sofort zurück?
Geben Sie die Controller-Klasse ein. Was ist der Rückgabewert? – chrylis
@chrylis Ich habe den Beitrag mit dem Code aus der Controller-Klasse aktualisiert. Bitte überprüfen Sie –
Sie haben den Inhalt der Controller-Methode nicht veröffentlicht. – chrylis