Java 为什么我的Spring@Async bean方法没有被异步执行?
我有一个Springboot应用程序,我试图在控制器方法中的bean类上执行一个异步方法。问题是@Async方法没有异步执行。执行将暂停,直到方法完成 谁能告诉我我错过了什么 这是我的应用程序类:Java 为什么我的Spring@Async bean方法没有被异步执行?,java,spring,asynchronous,spring-boot,Java,Spring,Asynchronous,Spring Boot,我有一个Springboot应用程序,我试图在控制器方法中的bean类上执行一个异步方法。问题是@Async方法没有异步执行。执行将暂停,直到方法完成 谁能告诉我我错过了什么 这是我的应用程序类: @SpringBootApplication @EnableAsync public class Application { public static void main(String[] args) { SpringApplication.run(Application.
@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;
}
}
@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();
}
}
下面是我的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;
}
}
}
我的控制器方法:
@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}";
}
@RequestMapping(“/utilities/longProcess”)
公共字符串longProcess(){
System.out.println(“启动长流程…”);
CsvFileDifferConfiguration上下文=新的CsvFileDifferConfiguration();
LongProcess=context.longProcessBean();
未来结果=process.call();
System.out.println(“完成!”);
返回“{success:1}”;
}
不幸的是,这个请求没有立即返回(我不关心结果)。已成功调用该方法,但未在后台调用。知道我遗漏了什么吗
作为测试,如果我将控制器方法更改为等待结果,则不会输入等待块:
@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}";
}
@RequestMapping(“/utilities/longProcess”)
公共字符串longProcess()引发InterruptedException{
System.out.println(“启动长流程…”);
CsvFileDifferConfiguration上下文=新的CsvFileDifferConfiguration();
LongProcess=context.longProcessBean();
未来结果=process.call();
而(!(result.isDone()){
Thread.sleep(1);//每次检查之间暂停10毫秒
System.out.println(“等待长进程…”);
}
System.out.println(“完成!”);
返回“{success:1}”;
}
您对CDI的使用有错误。
如果您使用Spring容器管理您的对象,您必须只处理ApplicationContext
或其功能,如@Autowired
代码
CsvFileDifferConfiguration context = new CsvFileDifferConfiguration();
这是错误的
由于您将LongProcess
定义为@Bean
,因此只需将其注入@Controller
:
@Autowired
privete LongProcess process;
像以前一样使用它
直接使用对象(例如新建
)会丢失依赖项注入
功能
请阅读更多的Spring文档