AWS Lambda偶发重启及FunctionCatalog Bean缺失问题排查求助
AWS Lambda 偶发重启及NoSuchBeanDefinitionException问题排查与解决
我的AWS Lambda会不定期重启,且间歇性抛出异常:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.cloud.function.context.FunctionCatalog'
虽然功能能正常运行,但这个偶发问题一直无法定位原因,相关代码结构和依赖信息如下:
相关代码结构
Lambda入口类
@Slf4j @Generated @SpringBootApplication @EnableConfigurationProperties({Properties.class,}) public class LambdaApplication { private Properties properties; @Bean public Function<Event, Void> handleRequest() throws Exception { LambdaHandler handler = new LambdaHandler(properties); return handler::handleRequest; } public static void main(String[] args) { SpringApplication.run(LambdaApplication.class, args); } }
业务逻辑类
@Service public class LambdaHandler { public Void handleRequest(Event event) { // 业务逻辑实现 } }
配置类
@Data @ConfigurationProperties("items") public class Properties { private String appId; private String items; private String eventscare; // 其他属性省略 }
依赖版本信息
com.dev.CLASSPATHINFO : jar=spring-beans-5.3.30.jar baseName=spring-beans jarVersion=5.3.30 modTime=2023-12-19T20:30:18.000 length=706239 jarPath=lib/spring-beans-5.3.30.jar com.dev.CLASSPATHINFO : jar=spring-boot-2.7.16.jar baseName=spring-boot jarVersion=2.7.16 modTime=2023-12-19T20:30:18.000 length=1466387 jarPath=lib/spring-boot-2.7.16.jar com.dev.CLASSPATHINFO : jar=spring-boot-autoconfigure-2.7.16.jar baseName=spring-boot-autoconfigure jarVersion=2.7.16 modTime=2023-12-19T20:30:18.000 length=1689267 jarPath=lib/spring-boot-autoconfigure-2.7.16.jar com.dev.CLASSPATHINFO : jar=spring-boot-configuration-processor-2.7.16.jar baseName=spring-boot-configuration-processor jarVersion=2.7.16 modTime=2023-12-19T20:30:18.000 length=119803 jarPath=lib/spring-boot-configuration-processor-2.7.16.jar com.dev.CLASSPATHINFO : jar=spring-boot-starter-2.7.16.jar baseName=spring-boot-starter jarVersion=2.7.16 modTime=2023-12-19T20:30:18.000 length=4772 jarPath=lib/spring-boot-starter-2.7.16.jar com.dev.CLASSPATHINFO : jar=spring-boot-starter-json-2.7.16.jar baseName=spring-boot-starter-json jarVersion=2.7.16 modTime=2023-12-19T20:30:18.000 length=4749 jarPath=lib/spring-boot-starter-json-2.7.16.jar
问题排查与解决思路
1. 缺失Spring Cloud Function核心依赖
FunctionCatalog是Spring Cloud Function的核心类,当前依赖列表完全没有包含Spring Cloud Function相关包。Lambda冷启动或重启时,Spring上下文初始化找不到该类,就会抛出异常;后续请求可能因为容器复用暂时规避问题,但无法彻底解决。
需要添加适配Spring Boot 2.7.x的Spring Cloud Function依赖:
<!-- Maven示例,Gradle可对应调整 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-function-starter</artifactId> <version>3.2.10</version> <!-- 与Spring Boot 2.7.x兼容版本 --> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-function-adapter-aws</artifactId> <version>3.2.10</version> </dependency>
2. 手动实例化Bean破坏Spring依赖注入
当前入口类中手动new LambdaHandler(properties)存在两个问题:
properties变量未被Spring注入,处于未初始化状态,可能引发空指针或配置读取异常- 手动创建的
LambdaHandler不受Spring容器管理,破坏Bean生命周期和依赖链
修改为通过构造注入获取Bean:
@Slf4j @Generated @SpringBootApplication @EnableConfigurationProperties({Properties.class,}) public class LambdaApplication { private final Properties properties; private final LambdaHandler lambdaHandler; // 构造注入 public LambdaApplication(Properties properties, LambdaHandler lambdaHandler) { this.properties = properties; this.lambdaHandler = lambdaHandler; } @Bean public Function<Event, Void> handleRequest() { return lambdaHandler::handleRequest; } public static void main(String[] args) { SpringApplication.run(LambdaApplication.class, args); } }
3. 确保LambdaHandler由Spring管理
LambdaHandler标注了@Service,应该完全由Spring容器实例化和管理,禁止手动创建实例,避免破坏Spring的依赖注入机制。
4. 依赖版本兼容性校验
使用Spring Cloud 2021.0.8(Jubilee)版本,该版本与Spring Boot 2.7.16完全兼容,避免版本不匹配导致的上下文初始化异常。
内容的提问来源于stack exchange,提问作者Madhu Nair
相关产品推荐
相关产品推荐

