Skip to content

Commit a2ee940

Browse files
committed
fix: Reinitialization of Spring context when using SnapStart #805, fixes #814
2 parents 02fbc00 + 2d3174c commit a2ee940

File tree

4 files changed

+43
-10
lines changed

4 files changed

+43
-10
lines changed

aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapper.java

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,17 +41,13 @@ public class AsyncInitializationWrapper extends InitializationWrapper {
4141

4242
private static final int DEFAULT_INIT_GRACE_TIME_MS = 150;
4343
private static final String INIT_GRACE_TIME_ENVIRONMENT_VARIABLE_NAME = "AWS_SERVERLESS_JAVA_CONTAINER_INIT_GRACE_TIME";
44-
private static final String INITIALIZATION_TYPE_ENVIRONMENT_VARIABLE_NAME = "AWS_LAMBDA_INITIALIZATION_TYPE";
45-
private static final String INITIALIZATION_TYPE_ON_DEMAND = "on-demand";
46-
private static final String INITIALIZATION_TYPE = System.getenv().getOrDefault(INITIALIZATION_TYPE_ENVIRONMENT_VARIABLE_NAME,INITIALIZATION_TYPE_ON_DEMAND);
47-
private static final boolean ASYNC_INIT_DISABLED = !INITIALIZATION_TYPE.equals(INITIALIZATION_TYPE_ON_DEMAND);
4844
private static final int INIT_GRACE_TIME_MS = Integer.parseInt(System.getenv().getOrDefault(
4945
INIT_GRACE_TIME_ENVIRONMENT_VARIABLE_NAME, Integer.toString(DEFAULT_INIT_GRACE_TIME_MS)));
5046
private static final int LAMBDA_MAX_INIT_TIME_MS = 10_000;
5147

5248
private CountDownLatch initializationLatch;
5349
private final long actualStartTime;
54-
private Logger log = LoggerFactory.getLogger(AsyncInitializationWrapper.class);
50+
private final Logger log = LoggerFactory.getLogger(AsyncInitializationWrapper.class);
5551

5652

5753
/**
@@ -73,8 +69,8 @@ public AsyncInitializationWrapper() {
7369

7470
@Override
7571
public void start(InitializableLambdaContainerHandler handler) throws ContainerInitializationException {
76-
if(ASYNC_INIT_DISABLED){
77-
log.info("Async init disabled due to \"{}\" initialization", INITIALIZATION_TYPE);
72+
if (InitializationTypeHelper.isAsyncInitializationDisabled()){
73+
log.info("Async init disabled due to \"{}\" initialization", InitializationTypeHelper.getInitializationType());
7874
super.start(handler);
7975
return;
8076
}
@@ -107,7 +103,7 @@ public long getActualStartTimeMs() {
107103

108104
@Override
109105
public CountDownLatch getInitializationLatch() {
110-
if (ASYNC_INIT_DISABLED){
106+
if (InitializationTypeHelper.isAsyncInitializationDisabled()){
111107
return super.getInitializationLatch();
112108
}
113109
return initializationLatch;
@@ -116,7 +112,7 @@ public CountDownLatch getInitializationLatch() {
116112
private static class AsyncInitializer implements Runnable {
117113
private final InitializableLambdaContainerHandler handler;
118114
private CountDownLatch initLatch;
119-
private Logger log = LoggerFactory.getLogger(AsyncInitializationWrapper.class);
115+
private final Logger log = LoggerFactory.getLogger(AsyncInitializationWrapper.class);
120116

121117
AsyncInitializer(CountDownLatch latch, InitializableLambdaContainerHandler h) {
122118
initLatch = latch;
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/*
2+
* Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
5+
* with the License. A copy of the License is located at
6+
*
7+
* http://aws.amazon.com/apache2.0/
8+
*
9+
* or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
10+
* OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions
11+
* and limitations under the License.
12+
*/
13+
package com.amazonaws.serverless.proxy;
14+
15+
/**
16+
* Utility class that helps determine the initialization type
17+
*/
18+
public final class InitializationTypeHelper {
19+
20+
private static final String INITIALIZATION_TYPE_ENVIRONMENT_VARIABLE_NAME = "AWS_LAMBDA_INITIALIZATION_TYPE";
21+
private static final String INITIALIZATION_TYPE_ON_DEMAND = "on-demand";
22+
private static final String INITIALIZATION_TYPE = System.getenv().getOrDefault(INITIALIZATION_TYPE_ENVIRONMENT_VARIABLE_NAME,
23+
INITIALIZATION_TYPE_ON_DEMAND);
24+
private static final boolean ASYNC_INIT_DISABLED = !INITIALIZATION_TYPE.equals(INITIALIZATION_TYPE_ON_DEMAND);
25+
26+
public static boolean isAsyncInitializationDisabled() {
27+
return ASYNC_INIT_DISABLED;
28+
}
29+
30+
public static String getInitializationType() {
31+
return INITIALIZATION_TYPE;
32+
}
33+
}

aws-serverless-java-container-springboot3/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
<dependency>
2626
<groupId>org.springframework.cloud</groupId>
2727
<artifactId>spring-cloud-function-serverless-web</artifactId>
28-
<version>4.0.6</version>
28+
<version>4.1.1</version>
2929
</dependency>
3030
<dependency>
3131
<groupId>com.amazonaws.serverless</groupId>

aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import java.io.InputStream;
55
import java.io.OutputStream;
66

7+
import com.amazonaws.serverless.proxy.InitializationTypeHelper;
78
import com.amazonaws.serverless.proxy.model.AwsProxyResponse;
89
import org.springframework.cloud.function.serverless.web.FunctionClassUtils;
910
import org.springframework.cloud.function.serverless.web.ServerlessMVC;
@@ -53,6 +54,9 @@ public SpringDelegatingLambdaContainerHandler() {
5354
public SpringDelegatingLambdaContainerHandler(Class<?>... startupClasses) {
5455
this.startupClasses = startupClasses;
5556
this.mvc = ServerlessMVC.INSTANCE(this.startupClasses);
57+
if (InitializationTypeHelper.isAsyncInitializationDisabled()) {
58+
mvc.waitForContext();
59+
}
5660
this.mapper = new ObjectMapper();
5761
this.responseWriter = new AwsProxyHttpServletResponseWriter();
5862
}

0 commit comments

Comments
 (0)