diff --git a/lambda-invoker/src/main/java/com/networknt/aws/lambda/LambdaFunctionHandler.java b/lambda-invoker/src/main/java/com/networknt/aws/lambda/LambdaFunctionHandler.java index 8c1e597..af5aff0 100644 --- a/lambda-invoker/src/main/java/com/networknt/aws/lambda/LambdaFunctionHandler.java +++ b/lambda-invoker/src/main/java/com/networknt/aws/lambda/LambdaFunctionHandler.java @@ -23,6 +23,7 @@ import software.amazon.awssdk.http.async.SdkAsyncHttpClient; import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient; import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.retries.DefaultRetryStrategy; import software.amazon.awssdk.services.lambda.LambdaAsyncClient; import software.amazon.awssdk.services.lambda.model.InvokeRequest; @@ -58,6 +59,14 @@ public LambdaFunctionHandler() { .apiCallAttemptTimeout(Duration.ofSeconds(config.getApiCallAttemptTimeout())) .build(); + if(config.getMaxRetries() > 0) { + overrideConfig = overrideConfig.toBuilder() + .retryStrategy(DefaultRetryStrategy.standardStrategyBuilder() + .maxAttempts(config.getMaxRetries()) + .build()) + .build(); + } + var builder = LambdaAsyncClient.builder().region(Region.of(config.getRegion())) .httpClient(asyncHttpClient) .overrideConfiguration(overrideConfig); diff --git a/lambda-invoker/src/main/java/com/networknt/aws/lambda/LambdaInvokerConfig.java b/lambda-invoker/src/main/java/com/networknt/aws/lambda/LambdaInvokerConfig.java index 92a6640..a06d448 100644 --- a/lambda-invoker/src/main/java/com/networknt/aws/lambda/LambdaInvokerConfig.java +++ b/lambda-invoker/src/main/java/com/networknt/aws/lambda/LambdaInvokerConfig.java @@ -22,6 +22,7 @@ public class LambdaInvokerConfig { private static final String FUNCTIONS = "functions"; private static final String METRICS_INJECTION = "metricsInjection"; private static final String METRICS_NAME = "metricsName"; + private static final String MAX_RETRIES = "maxRetries"; private static final String MAX_CONCURRENCY = "maxConcurrency"; private static final String MAX_PENDING_CONNECTION_ACQUIRES = "maxPendingConnectionAcquires"; private static final String CONNECTION_ACQUISITION_TIMEOUT = "connectionAcquisitionTimeout"; @@ -34,6 +35,7 @@ public class LambdaInvokerConfig { private Map functions; private boolean metricsInjection; private String metricsName; + private int maxRetries; private int maxConcurrency; private int maxPendingConnectionAcquires; private int connectionAcquisitionTimeout; @@ -102,6 +104,14 @@ public void setMetricsName(String metricsName) { this.metricsName = metricsName; } + public int getMaxRetries() { + return maxRetries; + } + + public void setMaxRetries(int maxRetries) { + this.maxRetries = maxRetries; + } + public int getMaxConcurrency() { return maxConcurrency; } @@ -192,6 +202,10 @@ private void setConfigData() { if(object != null ) { metricsName = (String)object; } + object = mappedConfig.get(MAX_RETRIES); + if (object != null) { + maxRetries = Config.loadIntegerValue(MAX_RETRIES, object); + } object = mappedConfig.get(MAX_CONCURRENCY); if (object != null) { maxConcurrency = Config.loadIntegerValue(MAX_CONCURRENCY, object); diff --git a/lambda-invoker/src/main/resources/config/lambda-invoker.yml b/lambda-invoker/src/main/resources/config/lambda-invoker.yml index 85fcb45..afc1f33 100644 --- a/lambda-invoker/src/main/resources/config/lambda-invoker.yml +++ b/lambda-invoker/src/main/resources/config/lambda-invoker.yml @@ -7,6 +7,8 @@ endpointOverride: ${lambda-invoker.endpointOverride:} apiCallTimeout: ${lambda-invoker.apiCallTimeout:60000} # Api call attempt timeout in milliseconds. This sets the amount of time for each individual attempt. apiCallAttemptTimeout: ${lambda-invoker.apiCallAttemptTimeout:20000} +# The maximum number of retries for the Lambda function invocation. Default is 3. Set to 0 to disable retries. +maxRetries: ${lambda-invoker.maxRetries:3} # The maximum number of concurrent requests that can be made to Lambda. Default is 50. maxConcurrency: ${lambda-invoker.maxConcurrency:50} # The maximum number of pending acquires allowed. Default is 10000.