[英]Why is my Spring @Async bean method not being executed asychronously?
我有一個Springboot應用程序,正在嘗試在控制器方法內的bean類上執行異步方法。 問題是我的@Async方法沒有異步執行。 在該方法完成之前,執行將停止。
誰能告訴我我所缺少的嗎?
這是我的應用程序類:
@SpringBootApplication
@EnableAsync
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
connector.setPort(9000);
connector.setAsyncTimeout(60000);
}
});
return factory;
}
}
這是我的bean類:
public class LongProcess {
@Async
public Future<String> call() {
try {
System.out.println("Sleeping now...");
Thread.sleep(10000);
return new AsyncResult<String>("Hey");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
}
我的配置類:
@Configuration
@EnableAsync
public class LongProcessConfiguration implements AsyncConfigurer {
@Bean
public LongProcess longProcessBean() {
return new LongProcess();
}
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setMaxPoolSize(10);
taskExecutor.setThreadNamePrefix("LULExecutor-");
taskExecutor.initialize();
return taskExecutor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return new SimpleAsyncUncaughtExceptionHandler();
}
}
我的控制器方法:
@RequestMapping("/utilities/longProcess")
public String longProcess() {
System.out.println("Starting long process...");
CsvFileDifferConfiguration context = new CsvFileDifferConfiguration();
LongProcess process = context.longProcessBean();
Future<String> result = process.call();
System.out.println("Done!");
return "{success: 1}";
}
不幸的是,此請求不會立即返回(我不在乎結果)。 該方法已成功調用,但未在后台調用。 知道我可能會缺少什么嗎?
作為測試,如果更改控制器方法以等待結果,則永遠不會輸入wait塊:
@RequestMapping("/utilities/longProcess")
public String longProcess() throws InterruptedException {
System.out.println("Starting long process...");
CsvFileDifferConfiguration context = new CsvFileDifferConfiguration();
LongProcess process = context.longProcessBean();
Future<String> result = process.call();
while (!(result.isDone())) {
Thread.sleep(1); //10-millisecond pause between each check
System.out.println("Waiting for Long Process...");
}
System.out.println("Done!");
return "{success: 1}";
}
您對CDI的使用有誤。 如果使用Spring Container管理對象,則必須處理ApplicationContext
或其類似@Autowired
。
編碼
CsvFileDifferConfiguration context = new CsvFileDifferConfiguration();
是錯的。
由於您將LongProcess
定義為@Bean
,因此可以將其注入到@Controller
:
@Autowired
privete LongProcess process;
並像以前一樣使用它。
直接使用對象(例如new
)會丟失dependency injection
功能。
請閱讀更多Spring Docs。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.