From 45b762d6737ea99664b5a874e54e973fbd9e69f8 Mon Sep 17 00:00:00 2001 From: Antonio Goncalves Date: Mon, 9 Dec 2024 10:24:34 +0100 Subject: [PATCH] Send and receive messages to a local Azure Service Bus Emulator --- .editorconfig | 2 +- servicebus/emulator/README.md | 58 +++++++++++++++ servicebus/emulator/pom.xml | 74 +++++++++++++++++++ servicebus/emulator/src/main/docker/.env | 2 + .../emulator/src/main/docker/config.json | 28 +++++++ .../src/main/docker/docker-compose.yaml | 32 ++++++++ .../servicebus/emulator/ReceiveMessage.java | 45 +++++++++++ .../servicebus/emulator/SendMessage.java | 27 +++++++ servicebus/pom.xml | 1 + 9 files changed, 268 insertions(+), 1 deletion(-) create mode 100644 servicebus/emulator/README.md create mode 100644 servicebus/emulator/pom.xml create mode 100644 servicebus/emulator/src/main/docker/.env create mode 100644 servicebus/emulator/src/main/docker/config.json create mode 100644 servicebus/emulator/src/main/docker/docker-compose.yaml create mode 100644 servicebus/emulator/src/main/java/examples/azure/servicebus/emulator/ReceiveMessage.java create mode 100644 servicebus/emulator/src/main/java/examples/azure/servicebus/emulator/SendMessage.java diff --git a/.editorconfig b/.editorconfig index 84881bd9..2b850389 100644 --- a/.editorconfig +++ b/.editorconfig @@ -15,5 +15,5 @@ max_line_length = 1000 [{*.md,*.asciidoc}] max_line_length = 1000 -[{*.yaml,*.yml}] +[{*.json,*.yaml,*.yml}] indent_size = 2 diff --git a/servicebus/emulator/README.md b/servicebus/emulator/README.md new file mode 100644 index 00000000..bb63d0a3 --- /dev/null +++ b/servicebus/emulator/README.md @@ -0,0 +1,58 @@ + +# Send and receive a message to a local Azure Service Bus Emulator + +## Prerequisites + +This example assumes you have Docker installed as it uses the Azure Service Bus Emulator Docker image. + +## Start the Azure Service Bus Emulator + +Make sure Docker Engine is operational in the background. Then, start the Azure Service Bus Emulator using the following command: + +```shell +docker compose -f src/main/docker/docker-compose.yaml up -d +``` + +## Send and receive messages to an Azure Service Bus Emulator + +First, create the environment variables used to connect to our Azure Service Bus Emulator +using the command line below: + + +```shell + export SERVICE_BUS_QUEUE_CONNECTION_STRING=Endpoint=sb://127.0.0.1;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=SAS_KEY_VALUE;UseDevelopmentEmulator=true; + export SERVICE_BUS_QUEUE=queue.1 +``` + +Then compile the code: + +```shell + mvn clean compile +``` + +Listen to the incoming messages with the following command: + +```shell + mvn exec:java -Preceive +``` + +And then send messages: + +```shell + mvn exec:java -Psend +``` + +## Cleanup + +```shell +docker compose -f src/main/docker/docker-compose.yaml down +``` + +## References + +* [Overview of the Azure Service Bus emulator](https://learn.microsoft.com/en-us/azure/service-bus-messaging/overview-emulator) +* [Test locally by using the Azure Service Bus emulator](https://learn.microsoft.com/en-us/azure/service-bus-messaging/test-locally-with-service-bus-emulator?tabs=docker-linux-container) +* [Azure Service Bus emulator config file](https://github.com/Azure/azure-service-bus-emulator-installer/blob/main/ServiceBus-Emulator/Config/Config.json) +* [Simple Azure Service Bus Emulator – Finally Here!](https://devopsifyme.com/simple-azure-service-bus-emulator-finally-here) +* [Azure SQL Edge Docker image](https://hub.docker.com/r/microsoft/azure-sql-edge) +* [Emulator connection string support](https://github.com/Azure/azure-sdk-for-java/issues/38735) diff --git a/servicebus/emulator/pom.xml b/servicebus/emulator/pom.xml new file mode 100644 index 00000000..6967c8de --- /dev/null +++ b/servicebus/emulator/pom.xml @@ -0,0 +1,74 @@ + + + + 4.0.0 + + examples.azure.servicebus + project + 1-SNAPSHOT + + servicebus-emulator + jar + Azure Service Bus :: Send and receive message using the Azure Service Bus Emulator + + + + + com.azure + azure-sdk-bom + ${azure.bom.version} + pom + import + + + + + + + com.azure + azure-messaging-servicebus + + + org.slf4j + slf4j-simple + 1.7.30 + + + + + emulator + + + + receive + + + + org.codehaus.mojo + exec-maven-plugin + 3.5.0 + + examples.azure.servicebus.emulator.ReceiveMessage + + + + + + + send + + + + org.codehaus.mojo + exec-maven-plugin + 3.5.0 + + examples.azure.servicebus.emulator.SendMessage + + + + + + + + diff --git a/servicebus/emulator/src/main/docker/.env b/servicebus/emulator/src/main/docker/.env new file mode 100644 index 00000000..0204055c --- /dev/null +++ b/servicebus/emulator/src/main/docker/.env @@ -0,0 +1,2 @@ +ACCEPT_EULA=Y +MSSQL_SA_PASSWORD=myadmin!psswd246 diff --git a/servicebus/emulator/src/main/docker/config.json b/servicebus/emulator/src/main/docker/config.json new file mode 100644 index 00000000..07d81216 --- /dev/null +++ b/servicebus/emulator/src/main/docker/config.json @@ -0,0 +1,28 @@ +{ + "UserConfig": { + "Namespaces": [ + { + "Name": "sbemulatorns", + "Queues": [ + { + "Name": "queue.1", + "Properties": { + "DeadLetteringOnMessageExpiration": false, + "DefaultMessageTimeToLive": "PT1H", + "DuplicateDetectionHistoryTimeWindow": "PT20S", + "ForwardDeadLetteredMessagesTo": "", + "ForwardTo": "", + "LockDuration": "PT1M", + "MaxDeliveryCount": 10, + "RequiresDuplicateDetection": false, + "RequiresSession": false + } + } + ] + } + ], + "Logging": { + "Type": "File" + } + } +} diff --git a/servicebus/emulator/src/main/docker/docker-compose.yaml b/servicebus/emulator/src/main/docker/docker-compose.yaml new file mode 100644 index 00000000..3a097ea9 --- /dev/null +++ b/servicebus/emulator/src/main/docker/docker-compose.yaml @@ -0,0 +1,32 @@ +name: microsoft-azure-servicebus-emulator +services: + emulator: + container_name: "servicebus-emulator" + image: mcr.microsoft.com/azure-messaging/servicebus-emulator:latest + pull_policy: always + volumes: + - "./config.json:/ServiceBus_Emulator/ConfigFiles/Config.json" + ports: + - "5672:5672" + environment: + SQL_SERVER: sqledge + MSSQL_SA_PASSWORD: ${MSSQL_SA_PASSWORD} + ACCEPT_EULA: ${ACCEPT_EULA} + depends_on: + - sqledge + networks: + sb-emulator: + aliases: + - "sb-emulator" + sqledge: + container_name: "sqledge" + image: "mcr.microsoft.com/azure-sql-edge:latest" + networks: + sb-emulator: + aliases: + - "sqledge" + environment: + ACCEPT_EULA: ${ACCEPT_EULA} + MSSQL_SA_PASSWORD: ${MSSQL_SA_PASSWORD} +networks: + sb-emulator: diff --git a/servicebus/emulator/src/main/java/examples/azure/servicebus/emulator/ReceiveMessage.java b/servicebus/emulator/src/main/java/examples/azure/servicebus/emulator/ReceiveMessage.java new file mode 100644 index 00000000..ee9ccecd --- /dev/null +++ b/servicebus/emulator/src/main/java/examples/azure/servicebus/emulator/ReceiveMessage.java @@ -0,0 +1,45 @@ +package examples.azure.servicebus.emulator; + +import com.azure.messaging.servicebus.ServiceBusClientBuilder; +import com.azure.messaging.servicebus.ServiceBusProcessorClient; +import com.azure.messaging.servicebus.ServiceBusReceivedMessage; + +import java.util.concurrent.TimeUnit; + +public class ReceiveMessage { + + private static final String SERVICE_BUS_QUEUE_CONNECTION_STRING = System.getenv("SERVICE_BUS_QUEUE_CONNECTION_STRING"); + private static final String SERVICE_BUS_QUEUE = System.getenv("SERVICE_BUS_QUEUE"); + + private ServiceBusReceivedMessage receivedMessage; + + private boolean processed; + + public void execute() throws Exception { + ServiceBusProcessorClient client = new ServiceBusClientBuilder() + .connectionString(SERVICE_BUS_QUEUE_CONNECTION_STRING) + .processor() + .queueName(SERVICE_BUS_QUEUE) + .processMessage((context) -> { + receivedMessage = context.getMessage(); + processed = true; + }) + .processError((context) -> { + System.err.println(context.getException()); + processed = true; + }) + .buildProcessorClient(); + + client.start(); + while (!processed) { + TimeUnit.SECONDS.sleep(1); + } + System.out.println("Received a " + receivedMessage.getBody().toString()); + client.close(); + } + + public static void main(String[] arguments) throws Exception { + ReceiveMessage receiveMessage = new ReceiveMessage(); + receiveMessage.execute(); + } +} diff --git a/servicebus/emulator/src/main/java/examples/azure/servicebus/emulator/SendMessage.java b/servicebus/emulator/src/main/java/examples/azure/servicebus/emulator/SendMessage.java new file mode 100644 index 00000000..3c8d2aed --- /dev/null +++ b/servicebus/emulator/src/main/java/examples/azure/servicebus/emulator/SendMessage.java @@ -0,0 +1,27 @@ +package examples.azure.servicebus.emulator; + +import com.azure.messaging.servicebus.ServiceBusClientBuilder; +import com.azure.messaging.servicebus.ServiceBusMessage; +import com.azure.messaging.servicebus.ServiceBusSenderClient; + +import java.time.LocalDateTime; + +public class SendMessage { + + private static final String SERVICE_BUS_QUEUE_CONNECTION_STRING = System.getenv("SERVICE_BUS_QUEUE_CONNECTION_STRING"); + private static final String SERVICE_BUS_QUEUE = System.getenv("SERVICE_BUS_QUEUE"); + + public static void main(String[] arguments) { + ServiceBusSenderClient senderClient = new ServiceBusClientBuilder() + .connectionString(SERVICE_BUS_QUEUE_CONNECTION_STRING) + .sender() + .queueName(SERVICE_BUS_QUEUE) + .buildClient(); + + System.out.println("Sending...."); + senderClient.sendMessage(new ServiceBusMessage("Hello, World! at " + LocalDateTime.now())); + System.out.println("Sent a 'Hello, World!' message to " + SERVICE_BUS_QUEUE); + + System.exit(0); + } +} diff --git a/servicebus/pom.xml b/servicebus/pom.xml index a761dcda..e1aa8137 100644 --- a/servicebus/pom.xml +++ b/servicebus/pom.xml @@ -15,6 +15,7 @@ create create-queue + emulator jms-to-cosmosdb-springboot-1 jms-to-cosmosdb-springboot-2 jms-to-eventhubs-springboot