AWS lambda的新手使用java开发lambda函数。 我在aws中使用spring进行DI(依赖注入),并使用aws-api网关配置了我的lambda函数。 初始请求我在静态块中配置了spring应用程序上下文,因为静态块代码在将类加载到主内存时执行,并且该类只在JVM中加载一次。这是我的代码如下: -
System.out.println(System.getenv(PROFIES_TYPE));
springContainer = new AnnotationConfigApplicationContext(BeanConfiguration.class);
springContainer.getEnvironment().addActiveProfile(System.getenv(PROFIES_TYPE));
routingService = springContainer.getBean(RequestRoutingService.class);
这是我在静态块中编写的代码,我可以在我的aws云监视中看到两次弹簧初始化日志。 由于弹簧初始化两次,我的aws lambda函数的首次请求因aws api网关超时而失败....
答案 0 :(得分:0)
我认为这更多是因为在lambda中使用spring而与Api Gateway无关而创建的问题。我只面对lambda函数遇到了同样的问题,我仍然无法弄清楚它为什么会发生。但这是解决此问题的解决方法。
每当您想要读取bean时,请调用此方法以获取上下文并使用它来创建所需的bean。
public class LambdaHandler {
private static ApplicationContext springContext;
private static ApplicationContext getSpringContext() {
if (springContext == null) {
//initialise the spring context
}
return springContext;
}
public void handler() {
Foo bean = getSpringContext().getBean(Foo.class)
}
}