2013-03-02 223 views
3

我想實現一個異步任務,並立即返回並在後臺啓動任務的頁面。但是,該頁面將等待後臺任務完成並僅在之後返回。當我訪問/start時,需要15秒才能加載頁面。我使用的是Spring 3.2.0。我在test-servlet.xml中有一行包含<task:annotation-driven/>Spring MVC異步任務同步運行

奇怪的是,即使我用@Async(「this_bean_does_not_exist」)替換@Async(「this_bean_does_not_exist」),應用程序也會做同樣的事情(儘管我期待引用一個不存在的bean的異常)。

public interface AsyncTestService { 
    void startSlowProcess(); 
} 

@Service 
public class AsyncTestServiceImpl implements AsyncTestService { 

    @Override 
    @Async 
    public void startSlowProcess() { 
     try { 
      Thread.sleep(15000); 
     } catch (InterruptedException e) { 
      Thread.currentThread().interrupt(); 
     } 
    } 
} 

@Controller 
public class TestController { 

    @Autowired 
    AsyncTestService asyncTestService; 

    @RequestMapping("/start") 
    @ResponseBody 
    public String startSlowProcess() { 
     asyncTestService.startSlowProcess(); // It takes 15s to complete 
     return "STARTED"; // should return immediately 
    } 
} 

回答

3

你可能需要一個executor。試試這個:

<task:annotation-driven executor="myExecutor" />  
<task:executor id="myExecutor" pool-size="5"/> 

編輯:另一種可能的解決方案:使用EnableAsync代替(可用自春季3.1)

+0

我也試過,結果也一樣。 – 2013-03-02 11:20:26

+0

你在測試之前清理過你的項目嗎?你能證實,如果執行者實際上在運行嗎?根據文檔(參見上面的鏈接),需要顯式聲明的執行程序實例才能起作用。 – 2013-03-02 11:33:41

+0

是的!我從我的配置中缺少EnableAsync。謝謝! – 2013-03-02 13:14:22

0

首先讓你.xml的配置是這樣的:

<task:scheduler id="myScheduler" pool-size="10" /> 
<task:executor id="myExecutor" pool-size="10" /> 
<task:annotation-driven executor="myExecutor" scheduler="myScheduler" proxy-target-class="true" /> 

(是的,調度計數和執行程序線程池大小可配置)

或者只使用默認值:

<!-- enable task annotation to support @Async, @Scheduled, ... --> 
<task:annotation-driven /> 

其次確保@Async方法是公開的。