在调用页面时,我正在使用异步调用来减少客户端的等待时间。
作为一种体验,我有一个控制器,它使用@Async注释的方法调用pojo。在那个menthod我睡眠10000毫秒到模拟操作,以测试我的理论是否有效,似乎没有。下面的代码和更多信息可以在它之后找到:
测试控制器
@Conroller
public class TestController {
@RequestMapping("/test")
public String testAsyncCall() {
new AsyncTestClass().asyncOpOne();
return "secondpage";
}
}
包含@Async注释方法的异步类
public class AsyncTestClass {
@Async
public void asyncOpOne() {
try {
Thread.sleep(10000);
System.out.println("done working");
} catch (InterruptedException e) {
//
}
}
}
现在根据我的理解,当客户打电话给" / test"在他们的浏览器中,控制器应该返回调用异步方法并立即返回" secondpage"要渲染。
正在发生的事情是控制器不会返回第二页,直到异步调用中的10000毫秒结束,然后才返回第二页。
FYI @EnableAsync被添加到我的一个配置文件中(使用Java配置)。
我在这里做错了什么导致控制器在继续之前等待异步完成其睡眠?
答案 0 :(得分:4)
Spring使用AOP将@Async
行为应用于您的bean(例如@Transactional
也是如此)。
Spring只会将AOP应用于它知道的bean,因为你正构建一个超出Spring范围的新实例@Async
什么都不做。只需将其作为bean添加到您的配置中,然后将其注入您的控制器。
@Bean
public AsyncTestClass asyncTestClass() {
return new AsyncTestClass():
}
然后在你的通话类中。
@Conroller
public class TestController {
@Autowired
private AsyncTestClass asyncTestClass;
@RequestMapping("/test")
public String testAsyncCall() {
asyncTestClass.asyncOpOne();
return "secondpage";
}
}