# Azure Service Bus ## Oefening 1 (Samen) In deze oefening gaan we de basis opzetten om zowel queue op te vullen met berichten maar ook om uit te lezen. ### Azure Service Bus aanmaken Maak een nieuwe resource group aan in de portal. Daarna zoek je op **Service Bus** in de portal ![](https://i.imgur.com/Bg0YjXm.png) Vul voor uw eigen Azure Service Bus de juiste gegeven in. We kiezen voorlopig **Basic** als pricing tier. ![](https://i.imgur.com/f1Q9juU.png) Na het aanmaken komen we in het Service Bus Management scherm terecht. ![](https://i.imgur.com/cjtGIlh.png) ### Aanmaken van een Queue In het overzicht scherm van de Service Bus kunnen we bovenaan kiezen voor **+Queue**. ![](https://i.imgur.com/QkCZDUT.png) Daarna krijgen we onderstaande scherm waar we de default info laten staan en een naam kiezen vb: orders. ![](https://i.imgur.com/5tigO0N.png) Straks maken we een applicatie die berichten zal plaatsen op de queue. Hiervoor hebben we een connectiestring nodig. Deze maken we best aan per queue. We beperken ook best de rechten. Navigeer naar de aangemaakte queue in de Azure Portal. Open het scherm **Shared access policies**. Voeg een nieuwe policy toe die enkel mag versturen. ![](https://i.imgur.com/ZlKuZz1.png) Als je daarna op de policy drukt krijg je een scherm met alle informatie zoals de connectiestrings. Deze hebben we nodig in de volgende stap bij de verzend applicatie. ### Verzender De eerste applicatie die we zullen maken is de **verzender (producer)**. Deze applicatie zal voor ons berichten op de queue plaatsen met bvb orders, sensordata, etc... In dit voorbeeld gebruiken we een eenvoudige .NET Console Applicatie, maar dit kan ook een WebApplicatie, API, Python of Node.JS applicatie zijn. Maak een nieuwe lege repository aan en clone deze lokaal op je PC. In deze repository maken we een nieuwe **dotnet console** applciatie aan. via het commando **dotnet new console**. Daarna openen we dit in Visual Studio Code. Plak nu onderstaande code in **Program.cs**. ```csharp using System.Threading.Tasks; using Azure.Messaging.ServiceBus; // connection string to your Service Bus namespace string connectionString = "vul hier uw connectiestring in"; // name of your Service Bus queue string queueName = "vul hier de naam van de queue in"; // the client that owns the connection and can be used to create senders and receivers ServiceBusClient client; // the sender used to publish messages to the queue ServiceBusSender sender; // number of messages to be sent to the queue int numOfMessages = 3; var clientOptions = new ServiceBusClientOptions() { TransportType = ServiceBusTransportType.AmqpWebSockets }; client = new ServiceBusClient(connectionString, clientOptions); sender = client.CreateSender(queueName); // create a batch using ServiceBusMessageBatch messageBatch = await sender.CreateMessageBatchAsync(); for (int i = 1; i <= numOfMessages; i++) { // try adding a message to the batch if (!messageBatch.TryAddMessage(new ServiceBusMessage($"Message {i}"))) { // if it is too large for the batch throw new Exception($"The message {i} is too large to fit in the batch."); } } try { // Use the producer client to send the batch of messages to the Service Bus queue await sender.SendMessagesAsync(messageBatch); Console.WriteLine($"A batch of {numOfMessages} messages has been published to the queue."); } finally { // Calling DisposeAsync on client types is required to ensure that network // resources and other unmanaged objects are properly cleaned up. await sender.DisposeAsync(); await client.DisposeAsync(); } Console.WriteLine("Press any key to end the application"); Console.ReadKey(); ``` Start dit programma via **dotnet run** en kijk of de berichten in de queue op Azure aankomen. ![](https://i.imgur.com/DKeM0tp.png) ### Ontvanger Maak nu een tweede lege repository aan, clone deze lokaal op je systeem en maak een nieuwe Azure Function App aan. Maak ook een Access Key aan (zoals hierboven) die enkel kan lezen (Listen). De connectionstring voegen we dan toe in de local.settings.json file. ![](https://i.imgur.com/vsYFKqL.png) Aan deze applicatie voegen we een **Azure Service Bus Queue Trigger toe). ![](https://i.imgur.com/9LBnmE4.png) In stap 4 moeten we de settings kiezen uit de local.settings.json. ![](https://i.imgur.com/qtQC2ee.png) In stap 5 vullen we de naam van de Queue in. ![](https://i.imgur.com/oH9vcBZ.png) ```csharp public class MyMessageTrigger { [FunctionName("MyMessageTrigger")] public void Run([ServiceBusTrigger("testqueue", Connection = "SB")]string myQueueItem, ILogger log) { log.LogInformation($"C# ServiceBus queue trigger function processed message: {myQueueItem}"); } } ``` Test daarna de applicatie uit door zowel de sender als de ontvanger en controleer of de berichten aankomen. ## Oefening 2 (Zelfstandig) In deze oefening programmeren we een API voor het reserveren van tickets. Dit is een typisch voorbeeld waar een message queue goed van pas komt. Een **concert** heeft volgende velden, naam concert, datum, prijs, aantal vrije plaatsen voor normale tickets en aantal vrije plaatsen voor VIP tickets. Een **reservatie** bestaat uit het concert en één of meerdere normale tickets en/of één of meerdere VIP-tickets. We houden ook de totaalprijs bij van de tickets en de prijs voor het aantal normale en VIP-tickets houden we ook apart bij. Een ticket bevat alleen de naam van de persoon en zijn e-mail. Bij iedere reservatie van een ticket moeten we ook het aantal vrije tickets verlagen met het laatst gereserveerde aantal voor een concert. Een ticket reservatie plaatsen we op een queue om weg te schrijven naar de database. Dit wil zeggen bij de **POST** in de HTTP Trigger gaan we de reservatie **NIET** wegschrijven, we gaan deze op een **ServiceBus queue** plaatsen. Er zal dan een Queue trigger zijn die deze zal verwerken en wegschrijven naar de database. Om een bericht op een Service Bus queue te plaatsen kunnen we gebruik maken van **output bindings** in Azure Functions. Bekijk dit zelf op volgende URL: https://learn.microsoft.com/en-us/azure/azure-functions/functions-bindings-service-bus-output?tabs=in-process%2Cextensionv5&pivots=programming-language-csharp Zorg dat volgende API's beschikbaar zijn: - opvragen van alle concerten - reserveren van een ticket - opvragen van alle reservaties voor een concert Maak gebruik van Cosmos DB, Azure Queues en Azure Functions. De opstelling ziet er ongeveer als volgt uit: ![](https://i.imgur.com/AJ6I5no.png) De mensen die een VIP ticket krijgen een extra mail met info over de VIP. In de mail moet je de persoon aanspreken met de naam opgegen door de gebruiker. ![](https://i.imgur.com/kq6yVNJ.jpg) Het versturen van de mails gaan we uitvoeren via **Azure Logic Apps** zoek zelf op hoe we volgende zaken kunnen doen in Logic Apps: - Aanroepen Logic App Workflow vanuit Azure Functions - De nodig data doorsturen naar de Logic App Workflow (email en naam) - De e-mail versturen