gpt4 book ai didi

java - 加载上下文后,Spring java config 启动 @Async 方法

转载 作者:搜寻专家 更新时间:2023-11-01 01:06:23 24 4
gpt4 key购买 nike

我需要一个 POJO 方法来异步执行,所以我用 @Async 注释了它。我已经使用适当的 @ComponentScan@EnableAsync 添加到我的 @Configuration 类。这是一个供您运行的小测试用例。

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);
}
}
}
}

上面的代码将加载 AnnotationConfigApplicationContext 并退出。但是,如果我取消注释 //((AsyncBean)o).doStuff();,那么它将在单独的线程中运行。为什么@Async方法读完配置后没有启动?这就是我所期望的。

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

我还需要为 Spring 实现一些其他的东西来知道它必须启动我的 @Async 方法吗?

最佳答案

@Async 不应在加载 ApplicationContext 后运行。它旨在在调用时异步运行带注释的方法。

如果你想让一个方法在应用程序启动时运行,那么你应该使用 @PostConstruct 注释(在非延迟加载的 bean 上)。如果您需要该方法异步运行,那么您将不得不更加棘手,因为您同时使用了 @PostConstruct@Async (as noted in the last paragraph of 25.5.2 here)。

编辑:

@Async@Scheduled 之间的区别可能不是documentation 中最清楚的.通常,@Scheduled 用于告知下一次调用特定方法的时间,通常是周期性的。 @Async用于异步运行一个方法,即该方法会在启动一个后台线程完成该方法的工作后立即返回。

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

关于java - 加载上下文后,Spring java config 启动 @Async 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16781128/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com