Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我的Spring@Async bean方法没有被异步执行?_Java_Spring_Asynchronous_Spring Boot - Fatal编程技术网

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

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.

我有一个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;
    }
 }
@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文档