@Async带注释的方法在由控制器调用时不会异步操作

时间:2015-04-16 13:11:42

标签: spring

在调用页面时,我正在使用异步调用来减少客户端的等待时间。

作为一种体验,我有一个控制器,它使用@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配置)。

我在这里做错了什么导致控制器在继续之前等待异步完成其睡眠?

1 个答案:

答案 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";
    }
}