我需要一個POJO方法來異步執行,所以我用@Async
對它進行了註釋。我已將@EnableAsync
添加到我的@Configuration
類中,並添加了正確的@ComponentScan
。這裏有一個小的測試用例供你運行。加載上下文後,java配置文件啓動@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);
}
}
}
}
上面的代碼將加載AnnotationConfigApplicationContext
並退出。但是,如果我取消了對//((AsyncBean)o).doStuff();
的評論,那麼它將在單獨的線程中運行。爲什麼配置完全讀取後@Async
方法沒有啓動?這就是我所期望的。
我已經在上面留下了一些@Scheduled
的東西,所以你可以自己試試。在@Scheduled
的情況下,註釋的方法立即被觸發(在初始延遲之後)。
還有什麼我需要實現的春天知道它必須啓動我的@Async
方法?
是否有任何文檔更詳細地描述'@ Async'和'@ Scheduled'之間的區別? –
酷豆!感謝你的回答。 –
我只是偶然發現了這個答案,我得說它真的簡化了我正在爲一個項目進行修補的一些優化(異步填充緩存而不會阻止我的服務器啓動)。非常感謝你! – BSJ