From 22298613521f624ed75bf9e79dddb12f353b3d9e Mon Sep 17 00:00:00 2001
From: Mohammed Ehab Elsaeed <33024315+M-Elsaeed@users.noreply.github.com>
Date: Thu, 8 May 2025 20:41:33 +0100
Subject: [PATCH 01/56] Fix EventHandlerLoaderTest failing after
PojoSerializerLoaderTest (#542)
---
.../lambda/runtime/api/client/PojoSerializerLoaderTest.java | 2 ++
1 file changed, 2 insertions(+)
diff --git a/aws-lambda-java-runtime-interface-client/src/test/java/com/amazonaws/services/lambda/runtime/api/client/PojoSerializerLoaderTest.java b/aws-lambda-java-runtime-interface-client/src/test/java/com/amazonaws/services/lambda/runtime/api/client/PojoSerializerLoaderTest.java
index 7c6e9dcb4..c2c887973 100644
--- a/aws-lambda-java-runtime-interface-client/src/test/java/com/amazonaws/services/lambda/runtime/api/client/PojoSerializerLoaderTest.java
+++ b/aws-lambda-java-runtime-interface-client/src/test/java/com/amazonaws/services/lambda/runtime/api/client/PojoSerializerLoaderTest.java
@@ -7,6 +7,7 @@
import com.amazonaws.services.lambda.runtime.CustomPojoSerializer;
import com.amazonaws.services.lambda.runtime.serialization.PojoSerializer;
+import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -31,6 +32,7 @@ class PojoSerializerLoaderTest {
@Mock
private CustomPojoSerializer mockSerializer;
+ @AfterEach
@BeforeEach
void setUp() throws Exception {
resetStaticFields();
From 317b5ada21d3d31b55c948b62b2f978d97c89419 Mon Sep 17 00:00:00 2001
From: Ramisa Alam <44811300+ramisa2108@users.noreply.github.com>
Date: Mon, 26 May 2025 11:31:32 +0100
Subject: [PATCH 02/56] Add tenant id to Context interface (#545)
---
.../com/amazonaws/services/lambda/runtime/Context.java | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/aws-lambda-java-core/src/main/java/com/amazonaws/services/lambda/runtime/Context.java b/aws-lambda-java-core/src/main/java/com/amazonaws/services/lambda/runtime/Context.java
index a0850e78c..152765df1 100644
--- a/aws-lambda-java-core/src/main/java/com/amazonaws/services/lambda/runtime/Context.java
+++ b/aws-lambda-java-core/src/main/java/com/amazonaws/services/lambda/runtime/Context.java
@@ -100,4 +100,13 @@ public interface Context {
*/
LambdaLogger getLogger();
+ /**
+ *
+ * Returns the tenant ID associated with the request.
+ *
+ * @return null by default
+ */
+ default String getTenantId() {
+ return null;
+ }
}
From 45ffaeff9b22d0007e13daabc8fb33025e1910de Mon Sep 17 00:00:00 2001
From: Ramisa Alam <44811300+ramisa2108@users.noreply.github.com>
Date: Mon, 26 May 2025 13:32:14 +0100
Subject: [PATCH 03/56] Bump core version to 1.3.0 (#546)
---
README.md | 2 +-
aws-lambda-java-core/RELEASE.CHANGELOG.md | 4 ++++
aws-lambda-java-core/pom.xml | 2 +-
3 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index fdc08a759..7f4970949 100644
--- a/README.md
+++ b/README.md
@@ -43,7 +43,7 @@ public class HandlerStream implements RequestStreamHandler {
com.amazonaws
aws-lambda-java-core
- 1.2.3
+ 1.3.0
```
diff --git a/aws-lambda-java-core/RELEASE.CHANGELOG.md b/aws-lambda-java-core/RELEASE.CHANGELOG.md
index ebd0566ff..527e7dd46 100644
--- a/aws-lambda-java-core/RELEASE.CHANGELOG.md
+++ b/aws-lambda-java-core/RELEASE.CHANGELOG.md
@@ -1,3 +1,7 @@
+### May 26, 2025
+`1.3.0`
+- Adding support for multi tenancy ([#545](https://github.com/aws/aws-lambda-java-libs/pull/545))
+
### August 17, 2023
`1.2.3`:
- Extended logger interface with level-aware logging backend functions
diff --git a/aws-lambda-java-core/pom.xml b/aws-lambda-java-core/pom.xml
index 0dd848a96..2b3abc0ba 100644
--- a/aws-lambda-java-core/pom.xml
+++ b/aws-lambda-java-core/pom.xml
@@ -5,7 +5,7 @@
com.amazonaws
aws-lambda-java-core
- 1.2.3
+ 1.3.0
jar
AWS Lambda Java Core Library
From 5a0f8ad9e9b8ff61ba626e71c4b5de62134e82e4 Mon Sep 17 00:00:00 2001
From: Ramisa Alam <44811300+ramisa2108@users.noreply.github.com>
Date: Mon, 26 May 2025 15:23:45 +0100
Subject: [PATCH 04/56] Bump RIC to 2.7.0 (#544)
---
README.md | 2 +-
aws-lambda-java-runtime-interface-client/README.md | 4 ++--
aws-lambda-java-runtime-interface-client/RELEASE.CHANGELOG.md | 4 ++++
aws-lambda-java-runtime-interface-client/pom.xml | 4 ++--
4 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/README.md b/README.md
index 7f4970949..b1293c42d 100644
--- a/README.md
+++ b/README.md
@@ -163,7 +163,7 @@ The purpose of this package is to allow developers to deploy their applications
com.amazonaws
aws-lambda-java-runtime-interface-client
- 2.6.0
+ 2.7.0
```
diff --git a/aws-lambda-java-runtime-interface-client/README.md b/aws-lambda-java-runtime-interface-client/README.md
index 8a95e7ded..d49201bd5 100644
--- a/aws-lambda-java-runtime-interface-client/README.md
+++ b/aws-lambda-java-runtime-interface-client/README.md
@@ -70,7 +70,7 @@ pom.xml
com.amazonaws
aws-lambda-java-runtime-interface-client
- 2.6.0
+ 2.7.0
@@ -160,7 +160,7 @@ platform-specific JAR by setting the ``.
com.amazonaws
aws-lambda-java-runtime-interface-client
- 2.6.0
+ 2.7.0
linux-x86_64
```
diff --git a/aws-lambda-java-runtime-interface-client/RELEASE.CHANGELOG.md b/aws-lambda-java-runtime-interface-client/RELEASE.CHANGELOG.md
index 6a781b270..ac073ae85 100644
--- a/aws-lambda-java-runtime-interface-client/RELEASE.CHANGELOG.md
+++ b/aws-lambda-java-runtime-interface-client/RELEASE.CHANGELOG.md
@@ -1,3 +1,7 @@
+### May 21, 2025
+`2.7.0`
+- Adding support for multi tenancy ([#540](https://github.com/aws/aws-lambda-java-libs/pull/540))
+
### August 7, 2024
`2.6.0`
- Runtime API client improvements: use Lambda-Runtime-Function-Error-Type for reporting errors in format "Runtime."
diff --git a/aws-lambda-java-runtime-interface-client/pom.xml b/aws-lambda-java-runtime-interface-client/pom.xml
index e84cac0da..d4f7fd5e3 100644
--- a/aws-lambda-java-runtime-interface-client/pom.xml
+++ b/aws-lambda-java-runtime-interface-client/pom.xml
@@ -4,7 +4,7 @@
4.0.0
com.amazonaws
aws-lambda-java-runtime-interface-client
- 2.6.0
+ 2.7.0
jar
AWS Lambda Java Runtime Interface Client
@@ -61,7 +61,7 @@
com.amazonaws
aws-lambda-java-core
- 1.2.3
+ 1.3.0
com.amazonaws
From f001ae78f6f6f8a76dd260305934951f4d61e5de Mon Sep 17 00:00:00 2001
From: karthikpswamy
Date: Tue, 17 Jun 2025 09:43:00 -0700
Subject: [PATCH 05/56] Adding Key/Value Schema metadata attributes for
KafkaEvent (#548)
Co-authored-by: Karthik Puttaswamy
---
.../services/lambda/runtime/events/KafkaEvent.java | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/KafkaEvent.java b/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/KafkaEvent.java
index dd051d48f..aa6c00de3 100644
--- a/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/KafkaEvent.java
+++ b/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/KafkaEvent.java
@@ -43,6 +43,8 @@ public static class KafkaEventRecord {
private String key;
private String value;
private List
diff --git a/aws-lambda-java-runtime-interface-client/test/integration/test-handler/pom.xml b/aws-lambda-java-runtime-interface-client/test/integration/test-handler/pom.xml
index 2e240fe34..46d191a74 100644
--- a/aws-lambda-java-runtime-interface-client/test/integration/test-handler/pom.xml
+++ b/aws-lambda-java-runtime-interface-client/test/integration/test-handler/pom.xml
@@ -15,7 +15,7 @@
com.amazonaws
aws-lambda-java-runtime-interface-client
- 2.6.0
+ 2.8.4
@@ -50,4 +50,3 @@
-
From 199c9621eaa214720f099e0c9cb9b5496d8b813e Mon Sep 17 00:00:00 2001
From: Maxime David
Date: Mon, 24 Mar 2025 14:56:05 +0000
Subject: [PATCH 21/56] misc: merge from public (#80)
---
.github/workflows/runtime-interface-client_pr.yml | 8 --------
.github/workflows/samples.yml | 2 +-
README.md | 4 ++--
aws-lambda-java-events/README.md | 2 +-
aws-lambda-java-events/RELEASE.CHANGELOG.md | 4 ----
aws-lambda-java-events/pom.xml | 2 +-
aws-lambda-java-runtime-interface-client/README.md | 4 ++--
.../RELEASE.CHANGELOG.md | 4 ----
aws-lambda-java-runtime-interface-client/pom.xml | 2 +-
.../runtime/api/client/PojoSerializerLoaderTest.java | 2 --
.../test/integration/test-handler/pom.xml | 2 +-
aws-lambda-java-tests/pom.xml | 2 +-
.../fastJson/HelloWorldFunction/pom.xml | 2 +-
.../custom-serialization/gson/HelloWorldFunction/pom.xml | 2 +-
.../custom-serialization/moshi/HelloWorldFunction/pom.xml | 2 +-
.../request-stream-handler/HelloWorldFunction/pom.xml | 2 +-
samples/kinesis-firehose-event-handler/pom.xml | 2 +-
17 files changed, 15 insertions(+), 33 deletions(-)
diff --git a/.github/workflows/runtime-interface-client_pr.yml b/.github/workflows/runtime-interface-client_pr.yml
index 35c6ca06b..cbc5b5ab1 100644
--- a/.github/workflows/runtime-interface-client_pr.yml
+++ b/.github/workflows/runtime-interface-client_pr.yml
@@ -58,14 +58,6 @@ jobs:
- name: Available buildx platforms
run: echo ${{ steps.buildx.outputs.platforms }}
-
- - name: Build and install core dependency locally
- working-directory: ./aws-lambda-java-core
- run: mvn clean install
-
- - name: Build and install serialization dependency locally
- working-directory: ./aws-lambda-java-serialization
- run: mvn clean install -DskipTests
- name: Test Runtime Interface Client xplatform build - Run 'build' target
working-directory: ./aws-lambda-java-runtime-interface-client
diff --git a/.github/workflows/samples.yml b/.github/workflows/samples.yml
index 2b5e7833f..6d63f423e 100644
--- a/.github/workflows/samples.yml
+++ b/.github/workflows/samples.yml
@@ -42,7 +42,7 @@ jobs:
custom-serialization:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v4
# Set up both Java 8 and 21
- name: Set up Java 8 and 21
uses: actions/setup-java@v4
diff --git a/README.md b/README.md
index b5153a87f..7f4970949 100644
--- a/README.md
+++ b/README.md
@@ -75,7 +75,7 @@ public class SqsHandler implements RequestHandler {
com.amazonaws
aws-lambda-java-events
- 3.16.0
+ 3.15.0
```
@@ -163,7 +163,7 @@ The purpose of this package is to allow developers to deploy their applications
com.amazonaws
aws-lambda-java-runtime-interface-client
- 2.7.0
+ 2.6.0
```
diff --git a/aws-lambda-java-events/README.md b/aws-lambda-java-events/README.md
index 43c25d76a..87c61f345 100644
--- a/aws-lambda-java-events/README.md
+++ b/aws-lambda-java-events/README.md
@@ -74,7 +74,7 @@
com.amazonaws
aws-lambda-java-events
- 3.16.0
+ 3.15.0
...
diff --git a/aws-lambda-java-events/RELEASE.CHANGELOG.md b/aws-lambda-java-events/RELEASE.CHANGELOG.md
index a4bcd10a0..6c1769751 100644
--- a/aws-lambda-java-events/RELEASE.CHANGELOG.md
+++ b/aws-lambda-java-events/RELEASE.CHANGELOG.md
@@ -1,7 +1,3 @@
-### June 17, 2025
-`3.16.0`:
-- Add Schema metadata related attributes in KafkaEvent ([#548](https://github.com/aws/aws-lambda-java-libs/pull/548))
-
### January 31, 2025
`3.15.0`:
- Fix `CognitoUserPoolPreTokenGenerationEventV2` model ([#519](https://github.com/aws/aws-lambda-java-libs/pull/519))
diff --git a/aws-lambda-java-events/pom.xml b/aws-lambda-java-events/pom.xml
index 925273e9b..f1364e7ab 100644
--- a/aws-lambda-java-events/pom.xml
+++ b/aws-lambda-java-events/pom.xml
@@ -5,7 +5,7 @@
com.amazonaws
aws-lambda-java-events
- 3.16.1
+ 3.15.0
jar
AWS Lambda Java Events Library
diff --git a/aws-lambda-java-runtime-interface-client/README.md b/aws-lambda-java-runtime-interface-client/README.md
index 67a5972d6..368ab710a 100644
--- a/aws-lambda-java-runtime-interface-client/README.md
+++ b/aws-lambda-java-runtime-interface-client/README.md
@@ -70,7 +70,7 @@ pom.xml
com.amazonaws
aws-lambda-java-runtime-interface-client
- 2.7.0
+ 2.6.0
@@ -203,7 +203,7 @@ platform-specific JAR by setting the ``.
com.amazonaws
aws-lambda-java-runtime-interface-client
- 2.7.0
+ 2.6.0
linux-x86_64
```
diff --git a/aws-lambda-java-runtime-interface-client/RELEASE.CHANGELOG.md b/aws-lambda-java-runtime-interface-client/RELEASE.CHANGELOG.md
index ac073ae85..6a781b270 100644
--- a/aws-lambda-java-runtime-interface-client/RELEASE.CHANGELOG.md
+++ b/aws-lambda-java-runtime-interface-client/RELEASE.CHANGELOG.md
@@ -1,7 +1,3 @@
-### May 21, 2025
-`2.7.0`
-- Adding support for multi tenancy ([#540](https://github.com/aws/aws-lambda-java-libs/pull/540))
-
### August 7, 2024
`2.6.0`
- Runtime API client improvements: use Lambda-Runtime-Function-Error-Type for reporting errors in format "Runtime."
diff --git a/aws-lambda-java-runtime-interface-client/pom.xml b/aws-lambda-java-runtime-interface-client/pom.xml
index c854fabcd..fde515fda 100644
--- a/aws-lambda-java-runtime-interface-client/pom.xml
+++ b/aws-lambda-java-runtime-interface-client/pom.xml
@@ -4,7 +4,7 @@
4.0.0
com.amazonaws
aws-lambda-java-runtime-interface-client
- 2.8.4
+ 2.6.0
jar
AWS Lambda Java Runtime Interface Client
diff --git a/aws-lambda-java-runtime-interface-client/src/test/java/com/amazonaws/services/lambda/runtime/api/client/PojoSerializerLoaderTest.java b/aws-lambda-java-runtime-interface-client/src/test/java/com/amazonaws/services/lambda/runtime/api/client/PojoSerializerLoaderTest.java
index c2c887973..7c6e9dcb4 100644
--- a/aws-lambda-java-runtime-interface-client/src/test/java/com/amazonaws/services/lambda/runtime/api/client/PojoSerializerLoaderTest.java
+++ b/aws-lambda-java-runtime-interface-client/src/test/java/com/amazonaws/services/lambda/runtime/api/client/PojoSerializerLoaderTest.java
@@ -7,7 +7,6 @@
import com.amazonaws.services.lambda.runtime.CustomPojoSerializer;
import com.amazonaws.services.lambda.runtime.serialization.PojoSerializer;
-import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -32,7 +31,6 @@ class PojoSerializerLoaderTest {
@Mock
private CustomPojoSerializer mockSerializer;
- @AfterEach
@BeforeEach
void setUp() throws Exception {
resetStaticFields();
diff --git a/aws-lambda-java-runtime-interface-client/test/integration/test-handler/pom.xml b/aws-lambda-java-runtime-interface-client/test/integration/test-handler/pom.xml
index 46d191a74..5304d44b9 100644
--- a/aws-lambda-java-runtime-interface-client/test/integration/test-handler/pom.xml
+++ b/aws-lambda-java-runtime-interface-client/test/integration/test-handler/pom.xml
@@ -15,7 +15,7 @@
com.amazonaws
aws-lambda-java-runtime-interface-client
- 2.8.4
+ 2.6.0
diff --git a/aws-lambda-java-tests/pom.xml b/aws-lambda-java-tests/pom.xml
index da07133c1..9e3419c69 100644
--- a/aws-lambda-java-tests/pom.xml
+++ b/aws-lambda-java-tests/pom.xml
@@ -45,7 +45,7 @@
com.amazonaws
aws-lambda-java-events
- 3.16.1
+ 3.15.0
org.junit.jupiter
diff --git a/samples/custom-serialization/fastJson/HelloWorldFunction/pom.xml b/samples/custom-serialization/fastJson/HelloWorldFunction/pom.xml
index 7d3c44246..7325c72a0 100644
--- a/samples/custom-serialization/fastJson/HelloWorldFunction/pom.xml
+++ b/samples/custom-serialization/fastJson/HelloWorldFunction/pom.xml
@@ -20,7 +20,7 @@
com.amazonaws
aws-lambda-java-events
- 3.16.0
+ 3.15.0
diff --git a/samples/custom-serialization/gson/HelloWorldFunction/pom.xml b/samples/custom-serialization/gson/HelloWorldFunction/pom.xml
index fd4271824..dd3b8e9c5 100644
--- a/samples/custom-serialization/gson/HelloWorldFunction/pom.xml
+++ b/samples/custom-serialization/gson/HelloWorldFunction/pom.xml
@@ -20,7 +20,7 @@
com.amazonaws
aws-lambda-java-events
- 3.16.0
+ 3.15.0
com.google.code.gson
diff --git a/samples/custom-serialization/moshi/HelloWorldFunction/pom.xml b/samples/custom-serialization/moshi/HelloWorldFunction/pom.xml
index 2773ef1f1..f23214976 100644
--- a/samples/custom-serialization/moshi/HelloWorldFunction/pom.xml
+++ b/samples/custom-serialization/moshi/HelloWorldFunction/pom.xml
@@ -20,7 +20,7 @@
com.amazonaws
aws-lambda-java-events
- 3.16.0
+ 3.15.0
diff --git a/samples/custom-serialization/request-stream-handler/HelloWorldFunction/pom.xml b/samples/custom-serialization/request-stream-handler/HelloWorldFunction/pom.xml
index f6ca21bf7..68e7e81e9 100644
--- a/samples/custom-serialization/request-stream-handler/HelloWorldFunction/pom.xml
+++ b/samples/custom-serialization/request-stream-handler/HelloWorldFunction/pom.xml
@@ -20,7 +20,7 @@
com.amazonaws
aws-lambda-java-events
- 3.16.0
+ 3.15.0
com.google.code.gson
diff --git a/samples/kinesis-firehose-event-handler/pom.xml b/samples/kinesis-firehose-event-handler/pom.xml
index 56c959244..3d03205d3 100644
--- a/samples/kinesis-firehose-event-handler/pom.xml
+++ b/samples/kinesis-firehose-event-handler/pom.xml
@@ -46,7 +46,7 @@
com.amazonaws
aws-lambda-java-events
- 3.16.0
+ 3.15.0
From a9c7fd1eea83423ed8d5887d31c588b433146be2 Mon Sep 17 00:00:00 2001
From: Mohammed Ehab Elsaeed <33024315+M-Elsaeed@users.noreply.github.com>
Date: Wed, 7 May 2025 11:00:21 +0100
Subject: [PATCH 22/56] Multi-concurrency mode for the Runtime Interface Client
and thread_local C++ Curl Client (#82)
Multi Concurrent RIC and Enable Curl Multi Concurrent Requests
---
.github/dependabot.yml | 4 +
.../lambda/runtime/api/client/AWSLambda.java | 69 +++--
.../api/client/EventHandlerLoader.java | 4 +-
.../api/client/PojoSerializerLoader.java | 2 +-
.../ReservedRuntimeEnvironmentVariables.java | 13 +
.../api/client/util/ConcurrencyConfig.java | 55 ++++
.../include/aws/lambda-runtime/runtime.h | 1 -
.../deps/aws-lambda-cpp-0.2.7/src/runtime.cpp | 87 ++++---
.../runtime/api/client/AWSLambdaTest.java | 238 ++++++++++++++++++
.../client/util/ConcurrencyConfigTest.java | 94 +++++++
10 files changed, 502 insertions(+), 65 deletions(-)
create mode 100644 aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/util/ConcurrencyConfig.java
create mode 100644 aws-lambda-java-runtime-interface-client/src/test/java/com/amazonaws/services/lambda/runtime/api/client/AWSLambdaTest.java
create mode 100644 aws-lambda-java-runtime-interface-client/src/test/java/com/amazonaws/services/lambda/runtime/api/client/util/ConcurrencyConfigTest.java
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 3722537ae..34d287eec 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -1,5 +1,9 @@
version: 2
updates:
+ - package-ecosystem: "maven"
+ directory: "/aws-lambda-java-runtime-interface"
+ schedule:
+ interval: "weekly"
- package-ecosystem: "github-actions"
directory: "/"
diff --git a/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/AWSLambda.java b/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/AWSLambda.java
index 2eeb14e3d..fdd090077 100644
--- a/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/AWSLambda.java
+++ b/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/AWSLambda.java
@@ -19,6 +19,7 @@
import com.amazonaws.services.lambda.runtime.api.client.runtimeapi.converters.LambdaErrorConverter;
import com.amazonaws.services.lambda.runtime.api.client.runtimeapi.converters.XRayErrorCauseConverter;
import com.amazonaws.services.lambda.runtime.api.client.runtimeapi.dto.InvocationRequest;
+import com.amazonaws.services.lambda.runtime.api.client.util.ConcurrencyConfig;
import com.amazonaws.services.lambda.runtime.api.client.util.LambdaOutputStream;
import com.amazonaws.services.lambda.runtime.api.client.util.UnsafeUtil;
import com.amazonaws.services.lambda.runtime.logging.LogFormat;
@@ -35,6 +36,8 @@
import java.net.URLClassLoader;
import java.security.Security;
import java.util.Properties;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
/**
* The entrypoint of this class is {@link AWSLambda#startRuntime}. It performs two main tasks:
@@ -49,8 +52,8 @@
*/
public class AWSLambda {
- protected static URLClassLoader customerClassLoader;
-
+ private static URLClassLoader customerClassLoader;
+
private static final String TRUST_STORE_PROPERTY = "javax.net.ssl.trustStore";
private static final String JAVA_SECURITY_PROPERTIES = "java.security.properties";
@@ -68,9 +71,7 @@ public class AWSLambda {
private static final String INIT_TYPE_SNAP_START = "snap-start";
private static final String AWS_LAMBDA_INITIALIZATION_TYPE = System.getenv(ReservedRuntimeEnvironmentVariables.AWS_LAMBDA_INITIALIZATION_TYPE);
-
- private static LambdaRuntimeApiClient runtimeClient;
-
+
static {
// Override the disabledAlgorithms setting to match configuration for openjdk8-u181.
// This is to keep DES ciphers around while we deploying security updates.
@@ -137,15 +138,13 @@ private static LambdaRequestHandler findRequestHandler(final String handlerStrin
return requestHandler;
}
- private static LambdaRequestHandler getLambdaRequestHandlerObject(String handler, LambdaContextLogger lambdaLogger) throws ClassNotFoundException, IOException {
+ private static LambdaRequestHandler getLambdaRequestHandlerObject(String handler, LambdaContextLogger lambdaLogger, LambdaRuntimeApiClient runtimeClient) throws ClassNotFoundException, IOException {
UnsafeUtil.disableIllegalAccessWarning();
System.setOut(new PrintStream(new LambdaOutputStream(System.out), false, "UTF-8"));
System.setErr(new PrintStream(new LambdaOutputStream(System.err), false, "UTF-8"));
setupRuntimeLogger(lambdaLogger);
- runtimeClient = new LambdaRuntimeApiClientImpl(LambdaEnvironment.RUNTIME_API);
-
String taskRoot = System.getProperty("user.dir");
String libRoot = "/opt/java";
// Make system classloader the customer classloader's parent to ensure any aws-lambda-java-core classes
@@ -167,13 +166,13 @@ private static LambdaRequestHandler getLambdaRequestHandlerObject(String handler
}
if (INIT_TYPE_SNAP_START.equals(AWS_LAMBDA_INITIALIZATION_TYPE)) {
- onInitComplete(lambdaLogger);
+ onInitComplete(lambdaLogger, runtimeClient);
}
return requestHandler;
}
- public static void setupRuntimeLogger(LambdaLogger lambdaLogger)
+ private static void setupRuntimeLogger(LambdaLogger lambdaLogger)
throws ClassNotFoundException {
ReflectUtil.setStaticField(
Class.forName("com.amazonaws.services.lambda.runtime.LambdaRuntime"),
@@ -213,10 +212,11 @@ private static LogSink createLogSink() {
}
public static void main(String[] args) throws Throwable {
- try (LambdaContextLogger logger = initLogger()) {
- LambdaRequestHandler lambdaRequestHandler = getLambdaRequestHandlerObject(args[0], logger);
- startRuntimeLoop(lambdaRequestHandler, logger);
-
+ try (LambdaContextLogger lambdaLogger = initLogger()) {
+ LambdaRuntimeApiClient runtimeClient = new LambdaRuntimeApiClientImpl(LambdaEnvironment.RUNTIME_API);
+ LambdaRequestHandler lambdaRequestHandler = getLambdaRequestHandlerObject(args[0], lambdaLogger, runtimeClient);
+ ConcurrencyConfig concurrencyConfig = new ConcurrencyConfig(lambdaLogger);
+ startRuntimeLoops(lambdaRequestHandler, lambdaLogger, concurrencyConfig, runtimeClient);
} catch (IOException | ClassNotFoundException t) {
throw new Error(t);
}
@@ -232,7 +232,38 @@ private static LambdaContextLogger initLogger() {
return logger;
}
- private static void startRuntimeLoop(LambdaRequestHandler requestHandler, LambdaContextLogger lambdaLogger) throws Throwable {
+ private static void startRuntimeLoopWithExecutor(LambdaRequestHandler lambdaRequestHandler, LambdaContextLogger lambdaLogger, ExecutorService executorService, LambdaRuntimeApiClient runtimeClient) {
+ executorService.submit(() -> {
+ try {
+ startRuntimeLoop(lambdaRequestHandler, lambdaLogger, runtimeClient);
+ } catch (Exception e) {
+ lambdaLogger.log(String.format("Runtime Loop on Thread ID: %s Failed.\n%s", Thread.currentThread().getName(), UserFault.trace(e)), lambdaLogger.getLogFormat() == LogFormat.JSON ? LogLevel.ERROR : LogLevel.UNDEFINED);
+ }
+ });
+ }
+
+ protected static void startRuntimeLoops(LambdaRequestHandler lambdaRequestHandler, LambdaContextLogger lambdaLogger, ConcurrencyConfig concurrencyConfig, LambdaRuntimeApiClient runtimeClient) throws Exception {
+ if (concurrencyConfig.isMultiConcurrent()) {
+ lambdaLogger.log(concurrencyConfig.getConcurrencyConfigMessage(), lambdaLogger.getLogFormat() == LogFormat.JSON ? LogLevel.INFO : LogLevel.UNDEFINED);
+ ExecutorService platformThreadExecutor = Executors.newFixedThreadPool(concurrencyConfig.getNumberOfPlatformThreads());
+ try {
+ for (int i = 0; i < concurrencyConfig.getNumberOfPlatformThreads(); i++) {
+ startRuntimeLoopWithExecutor(lambdaRequestHandler, lambdaLogger, platformThreadExecutor, runtimeClient);
+ }
+ } finally {
+ platformThreadExecutor.shutdown();
+ while (true) {
+ if (platformThreadExecutor.isTerminated()) {
+ break;
+ }
+ }
+ }
+ } else {
+ startRuntimeLoop(lambdaRequestHandler, lambdaLogger, runtimeClient);
+ }
+ }
+
+ private static void startRuntimeLoop(LambdaRequestHandler lambdaRequestHandler, LambdaContextLogger lambdaLogger, LambdaRuntimeApiClient runtimeClient) throws Exception {
boolean shouldExit = false;
while (!shouldExit) {
UserFault userFault = null;
@@ -245,7 +276,7 @@ private static void startRuntimeLoop(LambdaRequestHandler requestHandler, Lambda
ByteArrayOutputStream payload;
try {
- payload = requestHandler.call(request);
+ payload = lambdaRequestHandler.call(request);
runtimeClient.reportInvocationSuccess(request.getId(), payload.toByteArray());
// clear interrupted flag in case if it was set by user's code
Thread.interrupted();
@@ -275,7 +306,7 @@ private static void startRuntimeLoop(LambdaRequestHandler requestHandler, Lambda
}
}
- static void onInitComplete(final LambdaContextLogger lambdaLogger) throws IOException {
+ private static void onInitComplete(final LambdaContextLogger lambdaLogger, LambdaRuntimeApiClient runtimeClient) throws IOException {
try {
Core.getGlobalContext().beforeCheckpoint(null);
runtimeClient.restoreNext();
@@ -303,4 +334,8 @@ private static void logExceptionCloudWatch(LambdaContextLogger lambdaLogger, Exc
UserFault userFault = UserFault.makeUserFault(exc, true);
lambdaLogger.log(userFault.reportableError(), lambdaLogger.getLogFormat() == LogFormat.JSON ? LogLevel.ERROR : LogLevel.UNDEFINED);
}
+
+ protected static URLClassLoader getCustomerClassLoader() {
+ return customerClassLoader;
+ }
}
diff --git a/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/EventHandlerLoader.java b/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/EventHandlerLoader.java
index 2876499ec..8fab27fed 100644
--- a/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/EventHandlerLoader.java
+++ b/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/EventHandlerLoader.java
@@ -116,7 +116,7 @@ private static PojoSerializer