当前位置: 首页 > 知识库问答 >
问题:

加载上下文后,Spring java config start@Async方法

田成仁
2023-03-14

我需要一个POJO方法来异步执行,所以我用Async注释了它。我已使用适当的组件扫描将启用同步添加到我的配置类中。这里有一个供您运行的小测试用例。

public class Test {
    public static void main(String[] args) throws InterruptedException {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        context.register(MyConfig.class);
        context.refresh();
        Object o = context.getBean(AsyncBean.class);

        //((AsyncBean)o).doStuff();

        System.out.println(o);

    }

    @ComponentScan(basePackages = "my.package")
    @EnableAsync
    @Configuration
    // @EnableScheduling
    public static class MyConfig {
        @Bean
        public AsyncBean bean() throws InterruptedException {
            AsyncBean b = new AsyncBean();
            return b;
        }
    }

    public static class AsyncBean {
        //@Scheduled(fixedRate = 10000L, initialDelay = 1000L)
        @Async
        public void doStuff() throws InterruptedException {
            for (int i = 0; i < 5; i++) {
                System.out.println("async loop" + i + " -> " + Thread.currentThread().getId());
                Thread.sleep(1000L);
            }
        }
    }
}

上面的代码将加载注释ConfigApplicationContext并退出。然而,如果我取消注释((AsyncBean)o)。doStuff() ,那么它将在单独的线程中运行。为什么配置完全读取时,异步方法没有启动?这就是我所期望的。

我在上面留了一些预定的东西,你可以自己试试。在调度的情况下,带注释的方法立即被触发(即在初始延迟之后)。

为了让Spring知道它必须启动我的异步方法,我还需要实现什么吗?

共有1个答案

殳勇
2023-03-14

@Async不打算在加载应用程序上下文后运行。它旨在在调用带注释的方法时异步运行该方法。

如果希望在应用程序启动时运行一个方法,那么应该使用@PostConstruct注释(在非延迟加载的bean上)。如果您需要异步运行该方法,那么您将不得不更加复杂,因为您同时使用@PostConstruct@Async(如25.5.2的最后一段所述)。

编辑:

@Async@调度之间的区别可能不是留档中最清楚的。一般来说,@Schedula用于告诉下次调用特定方法的时间应该发生,并且通常是周期性的。@Async用于异步运行方法,即该方法在启动后台线程完成方法的工作后立即返回

令人困惑的部分是背景线程。他们都使用一个,但他们试图做的事情的性质不同(通常是非用户交互的定期背景工作与通常由用户发起的一次性背景工作)。

 类似资料:
  • 嗨,我有一个Spring Boot(2.1.6发行版)应用程序,我正在尝试添加一些简单的集成测试到我的应用程序。首先,我创建了一个基础IntegrationTest类,如下所示: 这是我的测试方法: 有什么建议吗?

  • 我使用Maven和surefire插件通过扩展AbstractTestNGSpringContextTests来运行TestNG测试,结果显示,即使上下文在类路径中也没有加载,并且测试在我的ide中正常工作,但在Maven中不行。 @contextConfiguration(locations=Array(“classpath*:/com/gottex/gottware/server/offlin

  • 所以我有一个项目,在其中我使用Spring boot,并希望利用一个模块系统。我希望模块系统能够动态地重新加载。我让它几乎可以工作,但是@ComponentScan在模块中完全不工作。 有一个模块文件夹,包含启动时加载的jar文件,需要动态卸载、加载和重新加载。 模块通过AnnotationConfigApplicationContext创建,上下文的类加载器设置为核心的类加载器,模块接口中的方法

  • 在上下文参数中加载上下文和在调度程序 Servlet 的初始化参数中加载上下文之间有什么区别? 相对 我的理解是context-参数由上下文侦听器加载,应该只包含中间层bean。Dispatcher Servlet在其init方法中应该加载web层bean。这种理解正确吗?为什么我们分别加载两个东西?

  • 本文向大家介绍async和DOM Script文件加载比较,包括了async和DOM Script文件加载比较的使用技巧和注意事项,需要的朋友参考一下 目前我用demo.js作为执行文件操作.代码: 用sleep.php作为请求文件操作。代码: 1. 一般script标签加载 在浏览器加载情况: 图1-1. 下载阻塞DomReady 图1-2. 执行阻塞DomReady 图1-1. 下载阻塞Dom

  • 本文向大家介绍linux下上传下载文件夹的方法,包括了linux下上传下载文件夹的方法的使用技巧和注意事项,需要的朋友参考一下 Linux下目录复制:本机->远程服务器 test1为源目录,test2为目标目录,zhidao@192.168.0.1为远程服务器的用户名和ip地址。 Linux下目录复制:远程服务器->本机 zhidao@192.168.0.1为远程服务器的用户名和ip地址,test