Skip to content

Commit 955f829

Browse files
author
Pankaj Agrawal
committed
Rename API method for batch processing
1 parent e6c9a9d commit 955f829

File tree

9 files changed

+104
-45
lines changed

9 files changed

+104
-45
lines changed

powertools-sqs/src/main/java/software/amazon/lambda/powertools/sqs/PowertoolsSqs.java

Lines changed: 67 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
package software.amazon.lambda.powertools.sqs;
1515

1616
import java.lang.reflect.Constructor;
17-
import java.lang.reflect.InvocationTargetException;
1817
import java.util.ArrayList;
1918
import java.util.List;
2019
import java.util.function.Function;
@@ -89,48 +88,63 @@ public static <R> R enrichedMessageFromS3(final SQSEvent sqsEvent,
8988
return returnValue;
9089
}
9190

91+
/**
92+
* Provides ability to set default {@link SqsClient} to be used by utility.
93+
* If no default configuration is provided, client is instantiated via {@link SqsClient#create()}
94+
*
95+
* @param client {@link SqsClient} to be used by utility
96+
*/
9297
public static void defaultSqsClient(SqsClient client) {
9398
PowertoolsSqs.client = client;
9499
}
95100

96-
public static SqsClient defaultSqsClient() {
97-
return client;
98-
}
99-
100-
public static <R> List<R> partialBatchProcessor(final SQSEvent event,
101-
final Class<? extends SqsMessageHandler<R>> handler) {
102-
return partialBatchProcessor(event, false, handler);
101+
/**
102+
* @param event
103+
* @param handler
104+
* @param <R>
105+
* @return
106+
*/
107+
public static <R> List<R> batchProcessor(final SQSEvent event,
108+
final Class<? extends SqsMessageHandler<R>> handler) {
109+
return batchProcessor(event, false, handler);
103110
}
104111

105-
public static <R> List<R> partialBatchProcessor(final SQSEvent event,
106-
final boolean suppressException,
107-
final Class<? extends SqsMessageHandler<R>> handler) {
112+
/**
113+
* @param event
114+
* @param suppressException
115+
* @param handler
116+
* @param <R>
117+
* @return
118+
*/
119+
public static <R> List<R> batchProcessor(final SQSEvent event,
120+
final boolean suppressException,
121+
final Class<? extends SqsMessageHandler<R>> handler) {
108122

109-
try {
110-
SqsMessageHandler<R> handlerInstance;
111-
if (null == handler.getDeclaringClass()) {
112-
handlerInstance = handler.newInstance();
113-
} else {
114-
Constructor<? extends SqsMessageHandler<R>> constructor = handler.getDeclaredConstructor(handler.getDeclaringClass());
115-
constructor.setAccessible(true);
116-
handlerInstance = constructor.newInstance(handler.getDeclaringClass().newInstance());
117-
}
118-
return partialBatchProcessor(event, suppressException, handlerInstance);
119-
} catch (IllegalAccessException | InstantiationException | NoSuchMethodException | InvocationTargetException e) {
120-
LOG.error("Failed invoking process method on handler", e);
121-
throw new RuntimeException("Unexpected error occurred. Please raise issue at " +
122-
"https://github.com/awslabs/aws-lambda-powertools-java/issues", e);
123-
}
123+
SqsMessageHandler<R> handlerInstance = instantiatedHandler(handler);
124+
return batchProcessor(event, suppressException, handlerInstance);
124125
}
125126

126-
public static <R> List<R> partialBatchProcessor(final SQSEvent event,
127-
final SqsMessageHandler<R> handler) {
128-
return partialBatchProcessor(event, false, handler);
127+
/**
128+
* @param event
129+
* @param handler
130+
* @param <R>
131+
* @return
132+
*/
133+
public static <R> List<R> batchProcessor(final SQSEvent event,
134+
final SqsMessageHandler<R> handler) {
135+
return batchProcessor(event, false, handler);
129136
}
130137

131-
public static <R> List<R> partialBatchProcessor(final SQSEvent event,
132-
final boolean suppressException,
133-
final SqsMessageHandler<R> handler) {
138+
/**
139+
* @param event
140+
* @param suppressException
141+
* @param handler
142+
* @param <R>
143+
* @return
144+
*/
145+
public static <R> List<R> batchProcessor(final SQSEvent event,
146+
final boolean suppressException,
147+
final SqsMessageHandler<R> handler) {
134148
final List<R> handlerReturn = new ArrayList<>();
135149

136150
BatchContext batchContext = new BatchContext(defaultSqsClient());
@@ -154,6 +168,27 @@ public static <R> List<R> partialBatchProcessor(final SQSEvent event,
154168
return handlerReturn;
155169
}
156170

171+
private static SqsClient defaultSqsClient() {
172+
return client;
173+
}
174+
175+
private static <R> SqsMessageHandler<R> instantiatedHandler(final Class<? extends SqsMessageHandler<R>> handler) {
176+
177+
try {
178+
if (null == handler.getDeclaringClass()) {
179+
return handler.newInstance();
180+
}
181+
182+
final Constructor<? extends SqsMessageHandler<R>> constructor = handler.getDeclaredConstructor(handler.getDeclaringClass());
183+
constructor.setAccessible(true);
184+
return constructor.newInstance(handler.getDeclaringClass().newInstance());
185+
} catch (Exception e) {
186+
LOG.error("Failed creating handler instance", e);
187+
throw new RuntimeException("Unexpected error occurred. Please raise issue at " +
188+
"https://github.com/awslabs/aws-lambda-powertools-java/issues", e);
189+
}
190+
}
191+
157192
private static SQSMessage clonedMessage(final SQSMessage sqsMessage) {
158193
try {
159194
return objectMapper

powertools-sqs/src/main/java/software/amazon/lambda/powertools/sqs/SQSBatchProcessingException.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77

88
import static java.util.stream.Collectors.joining;
99

10+
/**
11+
*
12+
*/
1013
public class SQSBatchProcessingException extends RuntimeException {
1114

1215
private final List<Exception> exceptions;

powertools-sqs/src/main/java/software/amazon/lambda/powertools/sqs/SqsBatchProcessor.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
import java.lang.annotation.RetentionPolicy;
66
import java.lang.annotation.Target;
77

8-
8+
/**
9+
*
10+
*/
911
@Retention(RetentionPolicy.RUNTIME)
1012
@Target(ElementType.METHOD)
1113
public @interface SqsBatchProcessor {

powertools-sqs/src/main/java/software/amazon/lambda/powertools/sqs/SqsMessageHandler.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
import static com.amazonaws.services.lambda.runtime.events.SQSEvent.SQSMessage;
44

5+
/**
6+
*
7+
* @param <R>
8+
*/
59
@FunctionalInterface
610
public interface SqsMessageHandler<R> {
711

powertools-sqs/src/main/java/software/amazon/lambda/powertools/sqs/internal/SqsMessageBatchProcessorAspect.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import software.amazon.lambda.powertools.sqs.SqsBatchProcessor;
99

1010
import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.isHandlerMethod;
11-
import static software.amazon.lambda.powertools.sqs.PowertoolsSqs.partialBatchProcessor;
11+
import static software.amazon.lambda.powertools.sqs.PowertoolsSqs.batchProcessor;
1212
import static software.amazon.lambda.powertools.sqs.internal.SqsLargeMessageAspect.placedOnSqsEventRequestHandler;
1313

1414
@Aspect
@@ -29,7 +29,7 @@ && placedOnSqsEventRequestHandler(pjp)) {
2929

3030
SQSEvent sqsEvent = (SQSEvent) proceedArgs[0];
3131

32-
partialBatchProcessor(sqsEvent, sqsBatchProcessor.suppressException(), sqsBatchProcessor.value());
32+
batchProcessor(sqsEvent, sqsBatchProcessor.suppressException(), sqsBatchProcessor.value());
3333
}
3434

3535
return pjp.proceed(proceedArgs);

powertools-sqs/src/test/java/software/amazon/lambda/powertools/sqs/PowertoolsSqsBatchProcessorTest.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424
import static org.mockito.Mockito.verify;
2525
import static org.mockito.Mockito.verifyNoInteractions;
2626
import static org.mockito.Mockito.when;
27+
import static software.amazon.lambda.powertools.sqs.PowertoolsSqs.batchProcessor;
2728
import static software.amazon.lambda.powertools.sqs.PowertoolsSqs.defaultSqsClient;
28-
import static software.amazon.lambda.powertools.sqs.PowertoolsSqs.partialBatchProcessor;
2929

3030
class PowertoolsSqsBatchProcessorTest {
3131

@@ -48,7 +48,7 @@ void setUp() throws IOException {
4848

4949
@Test
5050
void shouldBatchProcessAndNotDeleteMessagesWhenAllSuccess() {
51-
List<String> returnValues = partialBatchProcessor(event, false, (message) -> {
51+
List<String> returnValues = batchProcessor(event, false, (message) -> {
5252
interactionClient.listQueues();
5353
return "Success";
5454
});
@@ -64,7 +64,7 @@ void shouldBatchProcessAndNotDeleteMessagesWhenAllSuccess() {
6464
@ParameterizedTest
6565
@ValueSource(classes = {SampleInnerSqsHandler.class, SampleSqsHandler.class})
6666
void shouldBatchProcessViaClassAndNotDeleteMessagesWhenAllSuccess(Class<? extends SqsMessageHandler<String>> handler) {
67-
List<String> returnValues = partialBatchProcessor(event, handler);
67+
List<String> returnValues = batchProcessor(event, handler);
6868

6969
assertThat(returnValues)
7070
.hasSize(2)
@@ -87,7 +87,7 @@ void shouldBatchProcessAndDeleteSuccessMessageOnPartialFailures() {
8787
};
8888

8989
assertThatExceptionOfType(SQSBatchProcessingException.class)
90-
.isThrownBy(() -> partialBatchProcessor(event, failedHandler))
90+
.isThrownBy(() -> batchProcessor(event, failedHandler))
9191
.satisfies(e -> {
9292

9393
assertThat(e.successMessageReturnValues())
@@ -116,7 +116,7 @@ void shouldBatchProcessAndFullFailuresInBatch() {
116116
};
117117

118118
assertThatExceptionOfType(SQSBatchProcessingException.class)
119-
.isThrownBy(() -> partialBatchProcessor(event, failedHandler))
119+
.isThrownBy(() -> batchProcessor(event, failedHandler))
120120
.satisfies(e -> {
121121

122122
assertThat(e.successMessageReturnValues())
@@ -141,7 +141,7 @@ void shouldBatchProcessAndFullFailuresInBatch() {
141141
@Test
142142
void shouldBatchProcessViaClassAndDeleteSuccessMessageOnPartialFailures() {
143143
assertThatExceptionOfType(SQSBatchProcessingException.class)
144-
.isThrownBy(() -> partialBatchProcessor(event, FailureSampleInnerSqsHandler.class))
144+
.isThrownBy(() -> batchProcessor(event, FailureSampleInnerSqsHandler.class))
145145
.satisfies(e -> {
146146

147147
assertThat(e.successMessageReturnValues())
@@ -176,7 +176,7 @@ void shouldBatchProcessAndSuppressExceptions() {
176176
return "Success";
177177
};
178178

179-
List<String> returnValues = partialBatchProcessor(event, true, failedHandler);
179+
List<String> returnValues = batchProcessor(event, true, failedHandler);
180180

181181
assertThat(returnValues)
182182
.hasSize(1)
@@ -188,7 +188,7 @@ void shouldBatchProcessAndSuppressExceptions() {
188188

189189
@Test
190190
void shouldBatchProcessViaClassAndSuppressExceptions() {
191-
List<String> returnValues = partialBatchProcessor(event, true, FailureSampleInnerSqsHandler.class);
191+
List<String> returnValues = batchProcessor(event, true, FailureSampleInnerSqsHandler.class);
192192

193193
assertThat(returnValues)
194194
.hasSize(1)

powertools-sqs/src/test/java/software/amazon/lambda/powertools/sqs/SampleSqsHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import com.amazonaws.services.lambda.runtime.events.SQSEvent;
44

5-
public class SampleSqsHandler implements SqsMessageHandler<String> {
5+
public class SampleSqsHandler implements SqsMessageHandler<Object> {
66
private int counter;
77

88
@Override

powertools-sqs/src/test/java/software/amazon/lambda/powertools/sqs/handlers/LambdaHandlerApiGateway.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@
44
import com.amazonaws.services.lambda.runtime.RequestHandler;
55
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent;
66
import software.amazon.lambda.powertools.sqs.LargeMessageHandler;
7+
import software.amazon.lambda.powertools.sqs.SampleSqsHandler;
8+
import software.amazon.lambda.powertools.sqs.SqsBatchProcessor;
79

810
public class LambdaHandlerApiGateway implements RequestHandler<APIGatewayProxyRequestEvent, String> {
911

1012
@Override
1113
@LargeMessageHandler
14+
@SqsBatchProcessor(value = SampleSqsHandler.class)
1215
public String handleRequest(APIGatewayProxyRequestEvent sqsEvent, Context context) {
1316
return sqsEvent.getBody();
1417
}

powertools-sqs/src/test/java/software/amazon/lambda/powertools/sqs/internal/SqsMessageBatchProcessorAspectTest.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import com.amazonaws.services.lambda.runtime.Context;
66
import com.amazonaws.services.lambda.runtime.RequestHandler;
7+
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent;
78
import com.amazonaws.services.lambda.runtime.events.SQSEvent;
89
import com.fasterxml.jackson.databind.ObjectMapper;
910
import org.junit.jupiter.api.BeforeEach;
@@ -13,8 +14,9 @@
1314
import software.amazon.awssdk.services.sqs.model.GetQueueUrlRequest;
1415
import software.amazon.awssdk.services.sqs.model.GetQueueUrlResponse;
1516
import software.amazon.lambda.powertools.sqs.SQSBatchProcessingException;
16-
import software.amazon.lambda.powertools.sqs.handlers.PartialBatchPartialFailureHandler;
17+
import software.amazon.lambda.powertools.sqs.handlers.LambdaHandlerApiGateway;
1718
import software.amazon.lambda.powertools.sqs.handlers.PartialBatchFailureSuppressedHandler;
19+
import software.amazon.lambda.powertools.sqs.handlers.PartialBatchPartialFailureHandler;
1820
import software.amazon.lambda.powertools.sqs.handlers.PartialBatchSuccessHandler;
1921

2022
import static org.assertj.core.api.Assertions.assertThat;
@@ -24,6 +26,7 @@
2426
import static org.mockito.Mockito.reset;
2527
import static org.mockito.Mockito.times;
2628
import static org.mockito.Mockito.verify;
29+
import static org.mockito.Mockito.verifyNoInteractions;
2730
import static org.mockito.Mockito.when;
2831
import static software.amazon.lambda.powertools.sqs.PowertoolsSqs.defaultSqsClient;
2932

@@ -94,6 +97,15 @@ void shouldBatchProcessMessageWithSuccessDeletedOnFailureWithSuppressionInBatchF
9497
verify(sqsClient).deleteMessageBatch(any(DeleteMessageBatchRequest.class));
9598
}
9699

100+
@Test
101+
void shouldNotTakeEffectOnNonSqsEventHandler() {
102+
LambdaHandlerApiGateway handlerApiGateway = new LambdaHandlerApiGateway();
103+
104+
handlerApiGateway.handleRequest(mock(APIGatewayProxyRequestEvent.class), context);
105+
106+
verifyNoInteractions(sqsClient);
107+
}
108+
97109
private void setupContext() {
98110
when(context.getFunctionName()).thenReturn("testFunction");
99111
when(context.getInvokedFunctionArn()).thenReturn("testArn");

0 commit comments

Comments
 (0)