为什么我的 Spring @Async bean 方法没有被异步执行?

Why is my Spring @Async bean method not being executed asychronously?

我有一个 Springboot 应用程序,我正在尝试在控制器方法内对 bean class 执行异步方法。问题是我的@Async 方法不是异步执行的。执行暂停,直到方法完成。

谁能告诉我我错过了什么?

这是我的申请 class:

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

这是我的豆子class:

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

}

我的配置class:

@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}";

    }

不幸的是,这个请求不会立即 return(我不关心结果)。该方法调用成功,但不在后台。知道我可能遗漏了什么吗?

作为测试,如果我将控制器方法更改为等待结果,则永远不会进入等待块:

@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 容器管理您的对象,您必须处理 ApplicationContext 或其能力,如 @Autowired.

代码

CsvFileDifferConfiguration context = new CsvFileDifferConfiguration();

错了。

由于您将 LongProcess 定义为 @Bean,您只需将其注入 @Controller:

@Autowired
privete LongProcess process;

并像以前一样使用它。

直接使用对象(例如 new)会失去 dependency injection 功能。

请阅读更多内容Spring文档。