2012-11-30 48 views
2

我想測試Spring MVC控制器的最新異步功能,但我一直無法使其工作。使用與Spring 3.2異步的控制器方法問題.RC2

這裏是我的異步方法的代碼:

@RequestMapping(value = "/hello") 
    public Callable<String> async(final Model model) { 
     System.out.println("entered async controller method"); 
     return new Callable<String>() { 
      public String call() throws Exception { 
       Thread.sleep(2000L); 
       model.addAttribute("message", "asyncRequest dealt with"); 
       System.out.println("about to return from call()"); 
       return "hello"; 
      } 
     }; 
} 

下面是web.xml中的相關部分:

<servlet> 
    <servlet-name>SpringMVC</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/spring/webmvc-config.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
    <async-supported>true</async-supported> 
</servlet> 

然而「即將從調用返回()」是從來沒有打印在控制檯,我永遠不會看到這樣的日誌:08:25:17 [MvcAsync1] WebAsyncManager - ... 在控制檯...

僅供參考,我使用Spring 3.2.RC2

回答

2

我終於找到了爲什麼我的樣品不工作:一是必須添加以下到Web-MVC配置文件:

<mvc:annotation-driven> 
    <mvc:async-support default-timeout="3000"/> 
</mvc:annotation-driven> 
6

進一步配置async-support實施AsyncTaskExecutor

默認情況下,Spring MVC的使用SimpleAsyncTaskExecutor執行由控制器方法返回的贖回情況。對於生產,您必須將其替換爲適合您環境的AsyncTaskExecutor實施。

創建AsyncTaskExecutor

<beans:bean id="asyncTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> 
    <beans:property name="corePoolSize" value="5" /> 
    <beans:property name="maxPoolSize" value="10" /> 
    <beans:property name="queueCapacity" value="25" /> 
</beans:bean> 

然後分配task-executor

<mvc:annotation-driven > 
    <mvc:async-support default-timeout="30000" task-executor="asyncTaskExecutor" /> 
</mvc:annotation-driven> 

http://blog.springsource.org/2012/05/10/spring-mvc-3-2-preview-making-a-controller-method-asynchronous/

0

喜做與下面的代碼相似的應用程序:

public String doSlowWork() { 

    System.out.println("Start slow work"); 
    try { 
     Thread.sleep(3000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    System.out.println("finish slow work"); 

    return "index";  // return view's name 
    } 

返回索引但未給出方法的日誌信息