我使用Spring註釋來配置控制器(@EnableWebMvc),服務(@service和@ComponentScan)。在我的一個服務中,我有一個使用@Async註釋的方法,並且我的配置類中也添加了@EnableAsync。當一個MVC控制器調用用@Async註解的服務方法時,我希望控制器立即返回而不用等待服務方法完成。通過它沒有。當我在服務方法中設置斷點時,我發現它實際上是在一個單獨的線程中運行,即堆棧跟蹤顯示 它正在使用下面配置的SimpleAsyncTaskExecutor。當調用@Async方法時,Spring MVC控制器不會立即返回
這裏是我的配置類註釋看起來像
@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;
}
這裏是我的MVC控制器方法看起來像
@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;
}
,服務方法看起來像這樣
@Async
public void sendSlideShareAssetEmail(User user, String email, String msg, String link, Asset asset) {
爲什麼MVC控制器不會立即返回?
發佈控制器類。什麼是回報價值? – chrylis
@chrylis我用控制器類的代碼更新了帖子。請檢查 –
您實際上沒有發佈控制器方法的內容。 – chrylis