2015-05-07 45 views
8

我使用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控制器不會立即返回?

+0

發佈控制器類。什麼是回報價值? – chrylis

+0

@chrylis我用控制器類的代碼更新了帖子。請檢查 –

+0

您實際上沒有發佈控制器方法的內容。 – chrylis

回答

0

我的猜測是你的EmailService bean被包含在兩個不同的上下文中。

這個answer from Ryan Stewart更詳細地解釋了問題/解決方案。

您是否有其他配置正在使用?在您的web.xml中是否定義了一個* -servlet.xml或其他servlet,可能會將您的EmailService帶入根環境?

您是否定義了ContextLoaderListener或ServletContextListener?除了組件掃描之外,這些人可能正在挑選您的電子郵件服務。

將您的整個源代碼樹包含爲組件掃描路徑似乎是可疑的。 嘗試限制您在組件掃描中使用的路徑以排除您的EmailService並查看它是否仍在SimpleAsyncTaskExecutor中執行。如果它不是你知道它是從不同的背景引入的。一旦找到其他上下文,您應該可以將其排除在外,並將其添加回其他上下文中的組件掃描或EnableAsync。

+0

您能否提供解決方案的簡短描述?否則,這只是一個評論,而不是一個答案。 –

相關問題