diff --git a/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/RabbitMQEvent.java b/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/RabbitMQEvent.java new file mode 100644 index 00000000..24fe946c --- /dev/null +++ b/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/RabbitMQEvent.java @@ -0,0 +1,57 @@ +package com.amazonaws.services.lambda.runtime.events; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; +import java.util.Map; + +/** + * Represents a Rabbit MQ event sent to Lambda + * Onboarding Amazon MQ as event source to Lambda + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder(setterPrefix = "with") +public class RabbitMQEvent { + + private String eventSource; + private String eventSourceArn; + private Map> rmqMessagesByQueue; + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder(setterPrefix = "with") + public static class RabbitMessage { + private BasicProperties basicProperties; + private boolean redelivered; + private String data; + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder(setterPrefix = "with") + public static class BasicProperties { + + private String contentType; + private String contentEncoding; + private Map headers; + private int deliveryMode; + private int priority; + private String correlationId; + private String replyTo; + private int expiration; + private String messageId; + private String timestamp; + private String type; + private String userId; + private String appId; + private String clusterId; + private int bodySize; + } +} diff --git a/aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/EventLoader.java b/aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/EventLoader.java index 0216d5e3..68cd37d3 100644 --- a/aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/EventLoader.java +++ b/aws-lambda-java-tests/src/main/java/com/amazonaws/services/lambda/runtime/tests/EventLoader.java @@ -105,6 +105,10 @@ public static SQSEvent loadSQSEvent(String filename) { return loadEvent(filename, SQSEvent.class); } + public static RabbitMQEvent loadRabbitMQEvent(String filename) { + return loadEvent(filename, RabbitMQEvent.class); + } + public static T loadEvent(String filename, Class targetClass) { if (!filename.endsWith("json")) { diff --git a/aws-lambda-java-tests/src/test/java/com/amazonaws/services/lambda/runtime/tests/EventLoaderTest.java b/aws-lambda-java-tests/src/test/java/com/amazonaws/services/lambda/runtime/tests/EventLoaderTest.java index 3bdd8eae..8f8fe50a 100644 --- a/aws-lambda-java-tests/src/test/java/com/amazonaws/services/lambda/runtime/tests/EventLoaderTest.java +++ b/aws-lambda-java-tests/src/test/java/com/amazonaws/services/lambda/runtime/tests/EventLoaderTest.java @@ -304,4 +304,38 @@ public void testLoadSecretsManagerRotationEvent() { .returns("arn:aws:secretsmanager:eu-central-1:123456789012:secret:/powertools/secretparam-xBPaJ5", from(SecretsManagerRotationEvent::getSecretId)) .returns("CreateSecret", from(SecretsManagerRotationEvent::getStep)); } + + @Test + public void testLoadRabbitMQEvent() { + RabbitMQEvent event = EventLoader.loadRabbitMQEvent("rabbitmq_event.json"); + assertThat(event).isNotNull(); + assertThat(event) + .returns("aws:rmq", from(RabbitMQEvent::getEventSource)) + .returns("arn:aws:mq:us-west-2:112556298976:broker:test:b-9bcfa592-423a-4942-879d-eb284b418fc8", from(RabbitMQEvent::getEventSourceArn)); + + Map> messagesByQueue = event.getRmqMessagesByQueue(); + assertThat(messagesByQueue).isNotEmpty(); + List messages = messagesByQueue.get("test::/"); + assertThat(messages).hasSize(1); + RabbitMQEvent.RabbitMessage firstMessage = messages.get(0); + assertThat(firstMessage) + .returns(false, RabbitMQEvent.RabbitMessage::getRedelivered) + .returns("eyJ0aW1lb3V0IjowLCJkYXRhIjoiQ1pybWYwR3c4T3Y0YnFMUXhENEUifQ==", RabbitMQEvent.RabbitMessage::getData); + + RabbitMQEvent.BasicProperties basicProperties = firstMessage.getBasicProperties(); + assertThat(basicProperties) + .returns("text/plain", from(RabbitMQEvent.BasicProperties::getContentType)) + .returns(1, from(RabbitMQEvent.BasicProperties::getDeliveryMode)) + .returns(34, from(RabbitMQEvent.BasicProperties::getPriority)) + .returns(60000, from(RabbitMQEvent.BasicProperties::getExpiration)) + .returns("AIDACKCEVSQ6C2EXAMPLE", from(RabbitMQEvent.BasicProperties::getUserId)) + .returns(80, from(RabbitMQEvent.BasicProperties::getBodySize)) + .returns("Jan 1, 1970, 12:33:41 AM", from(RabbitMQEvent.BasicProperties::getTimestamp)); + + Map headers = basicProperties.getHeaders(); + assertThat(headers).hasSize(3); + Map> header1 = (Map>) headers.get("header1"); + assertThat(header1.get("bytes")).contains(118, 97, 108, 117, 101, 49); + assertThat((Integer) headers.get("numberInHeader")).isEqualTo(10); + } } diff --git a/aws-lambda-java-tests/src/test/resources/rabbitmq_event.json b/aws-lambda-java-tests/src/test/resources/rabbitmq_event.json new file mode 100644 index 00000000..1f57c53a --- /dev/null +++ b/aws-lambda-java-tests/src/test/resources/rabbitmq_event.json @@ -0,0 +1,51 @@ +{ + "eventSource": "aws:rmq", + "eventSourceArn": "arn:aws:mq:us-west-2:112556298976:broker:test:b-9bcfa592-423a-4942-879d-eb284b418fc8", + "rmqMessagesByQueue": { + "test::/": [ + { + "basicProperties": { + "contentType": "text/plain", + "contentEncoding": null, + "headers": { + "header1": { + "bytes": [ + 118, + 97, + 108, + 117, + 101, + 49 + ] + }, + "header2": { + "bytes": [ + 118, + 97, + 108, + 117, + 101, + 50 + ] + }, + "numberInHeader": 10 + }, + "deliveryMode": 1, + "priority": 34, + "correlationId": null, + "replyTo": null, + "expiration": "60000", + "messageId": null, + "timestamp": "Jan 1, 1970, 12:33:41 AM", + "type": null, + "userId": "AIDACKCEVSQ6C2EXAMPLE", + "appId": null, + "clusterId": null, + "bodySize": 80 + }, + "redelivered": false, + "data": "eyJ0aW1lb3V0IjowLCJkYXRhIjoiQ1pybWYwR3c4T3Y0YnFMUXhENEUifQ==" + } + ] + } +} \ No newline at end of file