Spring @异步注释方法不';当控制器调用时,不能异步操作
我正在玩弄异步调用,以减少调用页面时客户端的等待时间 作为一个实验,我有一个控制器,它使用@Async注释的方法调用pojo。在那个方法中,我睡了10000毫秒来模拟操作,以测试我的理论是否有效,但它似乎不起作用。下面是代码,后面可以找到更多信息: 测试控制器Spring @异步注释方法不';当控制器调用时,不能异步操作,spring,Spring,我正在玩弄异步调用,以减少调用页面时客户端的等待时间 作为一个实验,我有一个控制器,它使用@Async注释的方法调用pojo。在那个方法中,我睡了10000毫秒来模拟操作,以测试我的理论是否有效,但它似乎不起作用。下面是代码,后面可以找到更多信息: 测试控制器 @Conroller public class TestController { @RequestMapping("/test") public String testAsyncCall() { new AsyncTestClass()
@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毫秒结束之前,控制器不会返回第二页,只有在这之后,它才会返回第二页
供参考
@EnableAsync被添加到我的一个配置文件中(使用Java配置)
我在这里做错了什么,导致控制器在继续之前等待异步完成睡眠?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";
}
}
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";
}
}
您没有使用Spring配置的实例,但正在自己构建一个新实例。。。使用spring配置的一个。@M.Deinum你能澄清一下吗,我不明白你说你在做
新的AsyncTestClass
是什么意思,这意味着你自己在spring的控制之外构造一个实例,所以基本上你的@Async
是无用的。为AsyncTestClass
添加一个bean,并将其注入控制器。那么这是否意味着我注释@Async的所有方法都应该在bean中并注入?@Aeseir正确,否则您无法获得启用AOP的代理。您没有使用Spring配置的实例,而是自己构建一个新实例。。。使用spring配置的一个。@M.Deinum你能澄清一下吗,我不明白你说你在做新的AsyncTestClass
是什么意思,这意味着你自己在spring的控制之外构造一个实例,所以基本上你的@Async
是无用的。为AsyncTestClass
添加一个bean,并将其注入控制器。那么这是否意味着我注释@Async的所有方法都应该在bean中并被注入?@Aeseir正确,否则无法获得启用AOP的代理。