背景
在测试环境中,Flowable 引擎在启动时没办法找到AsyncListenableTaskExecutor
类型的 bean,而它需要这个 bean 来处理异步任务。分析可能的原因和解决办法:
错误代码
kotlin
'springProcessEngineConfiguration' defined in class path resource
[org/flowable/spring/boot/ProcessEngineAutoConfiguration.class]: Bean
instantiation via factory method failed; nested exception is
org.springframework.beans.BeanInstantiationException: Failed to instantiate
[org.flowable.spring.SpringProcessEngineConfiguration]: Factory method
'springProcessEngineConfiguration' threw exception; nested exception is
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying
bean of type 'org.springframework.core.task.AsyncListenableTaskExecutor'
available: expected at least 1 bean which qualifies as autowire candidate.
Dependency annotations:
{@org.springframework.beans.factory.annotation.Qualifier("applicationTaskExecutor")}
问题原因
Flowable 的流程引擎需要一个异步任务执行器(AsyncListenableTaskExecutor),不过你的 Spring 应用里没有定义这样的 bean。错误信息里提到的@Qualifier("applicationTaskExecutor")
表明,它特别需要一个名为applicationTaskExecutor
的 bean,但这个 bean 在应用上下文中并不存在。
解决办法
1. 定义一个 AsyncListenableTaskExecutor Bean
你得在配置类里定义一个AsyncListenableTaskExecutor
类型的 bean。下面是一个示例:
kotlin
package com.lcw.one.workflow.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.AsyncListenableTaskExecutor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
@Configuration
public class TaskExecutorConfig {
@Bean(name = "applicationTaskExecutor")
public AsyncListenableTaskExecutor applicationTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5); // 核心线程数
executor.setMaxPoolSize(10); // 最大线程数
executor.setQueueCapacity(25); // 队列容量
executor.setThreadNamePrefix("flowable-task-");
executor.initialize();
return executor;
}
}
2. 启用异步支持
要确保你的 Spring Boot 应用启用了异步支持,在主应用类上添加@EnableAsync
注解
typescript
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
@SpringBootApplication
@EnableAsync
public class YourApplication {
public static void main(String[] args) {
SpringApplication.run(YourApplication.class, args);
}
}
验证解决方案
完成上述配置之后,Spring 应用上下文里就会有applicationTaskExecutor
这个 bean 了,Flowable 引擎在启动时就能找到它。这样,原本的NoSuchBeanDefinitionException
错误应该就可以解决。