Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring @异步注释方法不';当控制器调用时,不能异步操作_Spring - Fatal编程技术网

Spring @异步注释方法不';当控制器调用时,不能异步操作

Spring @异步注释方法不';当控制器调用时,不能异步操作,spring,Spring,我正在玩弄异步调用,以减少调用页面时客户端的等待时间 作为一个实验,我有一个控制器,它使用@Async注释的方法调用pojo。在那个方法中,我睡了10000毫秒来模拟操作,以测试我的理论是否有效,但它似乎不起作用。下面是代码,后面可以找到更多信息: 测试控制器 @Conroller public class TestController { @RequestMapping("/test") public String testAsyncCall() { new AsyncTestClass()

我正在玩弄异步调用,以减少调用页面时客户端的等待时间

作为一个实验,我有一个控制器,它使用@Async注释的方法调用pojo。在那个方法中,我睡了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毫秒结束之前,控制器不会返回第二页,只有在这之后,它才会返回第二页

供参考 @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的代理。