aws lambda和静态初始化块

时间:2018-02-12 13:40:11

标签: java aws-lambda

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网关超时而失败....

1 个答案:

答案 0 :(得分:0)

我认为这更多是因为在lambda中使用spring而与Api Gateway无关而创建的问题。我只面对lambda函数遇到了同样的问题,我仍然无法弄清楚它为什么会发生。但这是解决此问题的解决方法。

  1. 仅在第一次调用期间使用静态方法初始化spring上下文,并为后续请求返回初始化上下文。
  2. 每当您想要读取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)
        }
    }