我正在尝试测试Spring MVC控制器的最新异步功能,但我无法让它工作。
以下是我的异步方法的代码:
@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>
然而“即将从call()返回”永远不会在控制台中打印出来,我永远不会看到这样的日志: 08:25:17 [MvcAsync1] WebAsyncManager < / strong> - ... 在控制台......
仅供参考,我使用Spring 3.2.RC2
答案 0 :(得分:6)
进一步配置async-support
实施AsyncTaskExecutor
默认情况下,Spring MVC使用
SimpleAsyncTaskExecutor
来执行控制器方法返回的Callable实例。对于生产,您必须将其替换为适合您的环境的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>
答案 1 :(得分:2)
我终于找到了为什么我的示例无效:必须将以下内容添加到web-mvc配置文件中:
<mvc:annotation-driven>
<mvc:async-support default-timeout="3000"/>
</mvc:annotation-driven>
答案 2 :(得分: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
}
返回索引但不提供方法的日志信息