Skip to content

Commit 3ef9aab

Browse files
committed
feat: native Spring Web workloads (#335) - native and non-native Handler should use same processing logic
1 parent cb17885 commit 3ef9aab

File tree

5 files changed

+18
-20
lines changed

5 files changed

+18
-20
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public class AsyncInitializationWrapper extends InitializationWrapper {
4747
private static final boolean ASYNC_INIT_DISABLED = !INITIALIZATION_TYPE.equals(INITIALIZATION_TYPE_ON_DEMAND);
4848
private static final int INIT_GRACE_TIME_MS = Integer.parseInt(System.getenv().getOrDefault(
4949
INIT_GRACE_TIME_ENVIRONMENT_VARIABLE_NAME, Integer.toString(DEFAULT_INIT_GRACE_TIME_MS)));
50-
public static final int LAMBDA_MAX_INIT_TIME_MS = 10_000;
50+
private static final int LAMBDA_MAX_INIT_TIME_MS = 10_000;
5151

5252
private CountDownLatch initializationLatch;
5353
private final long actualStartTime;

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,18 +33,22 @@
3333
class AwsSpringHttpProcessingUtils {
3434

3535
private static Log logger = LogFactory.getLog(AwsSpringHttpProcessingUtils.class);
36+
private static final int LAMBDA_MAX_REQUEST_DURATION_MINUTES = 15;
3637

3738
private AwsSpringHttpProcessingUtils() {
3839

3940
}
4041

41-
public static AwsProxyResponse processRequest(String gatewayEvent, ServerlessMVC mvc, ObjectMapper mapper, AwsProxyHttpServletResponseWriter responseWriter) {
42-
HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(gatewayEvent, null, mvc.getServletContext(), mapper);
42+
public static AwsProxyResponse processRequest(HttpServletRequest request, ServerlessMVC mvc,
43+
AwsProxyHttpServletResponseWriter responseWriter) {
4344
CountDownLatch latch = new CountDownLatch(1);
4445
AwsHttpServletResponse response = new AwsHttpServletResponse(request, latch);
4546
try {
4647
mvc.service(request, response);
47-
latch.await(AsyncInitializationWrapper.LAMBDA_MAX_INIT_TIME_MS, TimeUnit.SECONDS);
48+
boolean requestTimedOut = !latch.await(LAMBDA_MAX_REQUEST_DURATION_MINUTES, TimeUnit.MINUTES); // timeout is potentially lower as user configures it
49+
if (requestTimedOut) {
50+
logger.warn("request timed out after " + LAMBDA_MAX_REQUEST_DURATION_MINUTES + " minutes");
51+
}
4852
AwsProxyResponse awsResponse = responseWriter.writeResponse(response, null);
4953
return awsResponse;
5054
}

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,10 @@ private void eventLoop(ServletWebServerApplicationContext context) {
127127

128128
try {
129129
logger.debug("Submitting request to the user's web application");
130-
131-
AwsProxyResponse awsResponse = AwsSpringHttpProcessingUtils.processRequest(incomingEvent.getBody(), mvc, mapper, responseWriter);
130+
131+
AwsProxyResponse awsResponse = AwsSpringHttpProcessingUtils.processRequest(
132+
AwsSpringHttpProcessingUtils.generateHttpServletRequest(incomingEvent.getBody(),
133+
null, mvc.getServletContext(), mapper), mvc, responseWriter);
132134
if (logger.isDebugEnabled()) {
133135
logger.debug("Received response - body: " + awsResponse.getBody() +
134136
"; status: " + awsResponse.getStatusCode() + "; headers: " + awsResponse.getHeaders());

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

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,11 @@
33
import java.io.IOException;
44
import java.io.InputStream;
55
import java.io.OutputStream;
6-
import java.util.concurrent.CountDownLatch;
7-
import java.util.concurrent.TimeUnit;
86

7+
import com.amazonaws.serverless.proxy.model.AwsProxyResponse;
98
import org.springframework.cloud.function.serverless.web.FunctionClassUtils;
109
import org.springframework.cloud.function.serverless.web.ServerlessMVC;
1110

12-
import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletResponse;
1311
import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter;
1412
import com.amazonaws.services.lambda.runtime.Context;
1513
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
@@ -63,15 +61,7 @@ public SpringDelegatingLambdaContainerHandler(Class<?>... startupClasses) {
6361
public void handleRequest(InputStream input, OutputStream output, Context lambdaContext) throws IOException {
6462
HttpServletRequest httpServletRequest = AwsSpringHttpProcessingUtils
6563
.generateHttpServletRequest(input, lambdaContext, this.mvc.getServletContext(), this.mapper);
66-
CountDownLatch latch = new CountDownLatch(1);
67-
AwsHttpServletResponse httpServletResponse = new AwsHttpServletResponse(httpServletRequest, latch);
68-
try {
69-
this.mvc.service(httpServletRequest, httpServletResponse);
70-
latch.await(10, TimeUnit.SECONDS);
71-
this.mapper.writeValue(output, responseWriter.writeResponse(httpServletResponse, lambdaContext));
72-
}
73-
catch (Exception e) {
74-
throw new IllegalStateException(e);
75-
}
64+
AwsProxyResponse awsProxyResponse = AwsSpringHttpProcessingUtils.processRequest(httpServletRequest, mvc, responseWriter);
65+
this.mapper.writeValue(output, awsProxyResponse);
7666
}
7767
}

aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,9 @@ public void validateRequestResponse(String jsonEvent) throws Exception {
221221
try (ConfigurableApplicationContext context = SpringApplication.run(EmptyApplication.class);) {
222222
ServerlessMVC mvc = ServerlessMVC.INSTANCE((ServletWebServerApplicationContext) context);
223223
AwsProxyHttpServletResponseWriter responseWriter = new AwsProxyHttpServletResponseWriter();
224-
AwsProxyResponse awsResponse = AwsSpringHttpProcessingUtils.processRequest(jsonEvent, mvc, mapper, responseWriter);
224+
AwsProxyResponse awsResponse = AwsSpringHttpProcessingUtils.processRequest(
225+
AwsSpringHttpProcessingUtils.generateHttpServletRequest(jsonEvent, null,
226+
mvc.getServletContext(), mapper), mvc, responseWriter);
225227
assertEquals("hello", awsResponse.getBody());
226228
assertEquals(200, awsResponse.getStatusCode());
227229
}

0 commit comments

Comments
 (0)