我需要一个 POJO 方法来异步执行,所以我用@Async
. 我已经@EnableAsync
用@Configuration
正确的@ComponentScan
. 这是一个供您运行的小测试用例。
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
,带注释的方法会立即被触发(即在初始延迟之后)。
@Async
为了让 Spring 知道它必须启动我的方法,我还需要实现其他什么吗?