Gyakorlat – Üzenetek küldése és fogadása témakör használatával
Úgy döntött, hogy egy Azure Service Bus-témakört használ értékesítési teljesítményüzenetek terjesztésére a Salesforce-alkalmazásban. Az értékesítési munkatársak az alkalmazást mobileszközökön használják az egyes területekre és időszakokra vonatkozó értékesítési adatokat összegző üzenetek küldésére. Ezeket az üzeneteket a vállalat működési régióiban található webszolgáltatásokhoz osztja el, beleértve az Amerikai Egyesült Államokat és Európát is.
Már implementálta a témakörhöz szükséges infrastruktúrát az Azure-előfizetéseiben. Most meg kell írnia azt a kódot, amely üzeneteket küld a témakörnek, és olyan kódot szeretne írni, amely lekéri az üzeneteket egy előfizetésből. Ezután üzenetet fog küldeni egy témakörnek, és lekéri egy adott előfizetés üzenetét.
Győződjön meg arról, hogy a megfelelő könyvtárban dolgozik az alábbi parancsok futtatásával az Azure Cloud Shellben:
cd ~/mslearn-connect-services-together/implement-message-workflows-with-service-bus/src/start
code .
Kód írása egy témakörbe küldött üzenet küldéséhez
Az értékesítési teljesítményről üzeneteket küldő összetevő befejezéséhez hajtsa végre az alábbi lépéseket:
Az Azure Cloud Shell-szerkesztőben nyissa meg a performancemessagesender/Program.cs fájlt, és keresse meg a következő kódsort:
const string ServiceBusConnectionString = "";
Az idézőjelek közé illessze be az előző gyakorlatban mentett kapcsolati sztring.
Ha az üzenetsor nevének salesperformancemessages-től eltérő nevet használt, frissítse a kódban szereplő tulajdonság értékét
TopicName
:const string TopicName = "salesperformancemessages";
Keresse meg a metódust
SendPerformanceMessageAsync()
. (Tipp: A 26.) Ezen a metóduson belül keresse meg a következő kódsort:// Create a Service Bus client here
Cserélje le ezt a kódsort a következő kódra:
// By leveraging "await using", the DisposeAsync method will be called automatically when the client variable goes out of scope. // In more realistic scenarios, you would store off a class reference to the client (rather than to a local variable) so that it can be used throughout your program. await using var client = new ServiceBusClient(ServiceBusConnectionString);
A metóduson
SendPerformanceMessageAsync()
belül keresse meg a következő kódsort:// Create a sender here
Cserélje le ezt a kódsort a következő kódra:
await using ServiceBusSender sender = client.CreateSender(TopicName);
A blokkban
try...catch
keresse meg a következő kódsort:// Create and send a message here
Cserélje le ezt a kódsort a következő kódra:
string messageBody = "Total sales for Brazil in August: $13m."; var message = new ServiceBusMessage(messageBody);
Az üzenet konzolon való megjelenítéséhez szúrja be a következő kódot a következő sorba:
Console.WriteLine($"Sending message: {messageBody}");
Ha el szeretné küldeni az üzenetet a témakörnek, szúrja be a következő kódot a következő sorba:
await sender.SendMessageAsync(message);
Ellenőrizze, hogy a végleges kód hasonlít-e a következő példára:
using System; using System.Threading.Tasks; using Azure.Messaging.ServiceBus; namespace performancemessagesender { class Program { const string ServiceBusConnectionString = "Endpoint=sb://example.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=AbCdEfGhIjKlMnOpQrStUvWxYz=="; const string TopicName = "salesperformancemessages"; static void Main(string[] args) { Console.WriteLine("Sending a message to the Sales Performance topic..."); SendPerformanceMessageAsync().GetAwaiter().GetResult(); Console.WriteLine("Message was sent successfully."); } static async Task SendPerformanceMessageAsync() { // By leveraging "await using", the DisposeAsync method will be called automatically once the client variable goes out of scope. // In more realistic scenarios, you would store off a class reference to the client (rather than to a local variable) so that it can be used throughout your program. await using var client = new ServiceBusClient(ServiceBusConnectionString); await using ServiceBusSender sender = client.CreateSender(TopicName); try { string messageBody = "Total sales for Brazil in August: $13m."; var message = new ServiceBusMessage(messageBody); Console.WriteLine($"Sending message: {messageBody}"); await sender.SendMessageAsync(message); } catch (Exception exception) { Console.WriteLine($"{DateTime.Now} :: Exception: {exception.Message}"); } } } }
A fájlt a Ctrl+S billentyűkombinációval mentse el, majd a Ctrl+Q billentyűkombinációval zárja be a szerkesztőt.
Üzenet küldése a témakörbe
Az értékesítésről üzenetet küldő összetevő futtatásához futtassa a következő parancsot a Cloud Shellben:
dotnet run --project performancemessagesender
A program végrehajtásakor figyelje meg azokat az értesítéseket a Cloud Shellben, amelyek azt jelzik, hogy az üzenet küldése folyamatban van. Minden alkalommal, amikor futtatja az alkalmazást, egy másik üzenet kerül a témakörbe, és minden előfizetéshez elérhetővé válik egy példány.
Sending a message to the Sales Performance topic... Sending message: Total sales for Brazil in August: $13m. Message was sent successfully.
Az előfizetéshez tartozó üzenetek lekérése előtt ellenőrizze az üzenetek számát
Amikor megjelenik Message was sent successfully
, futtassa a következő parancsot, hogy lássa, hány üzenet található az Americas
előfizetésben. Ne felejtse el lecserélni <a névteret> a Service Bus-névtérre.
az servicebus topic subscription show \
--resource-group <rgn>[sandbox resource group name]</rgn> \
--topic-name salesperformancemessages \
--name Americas \
--query messageCount \
--namespace-name <namespace-name>
Ha lecseréli Americas
EuropeAndAsia
és újra futtatja a parancsot, látni fogja, hogy mindkét előfizetés azonos számú üzenettel rendelkezik.
Kód írása egy előfizetés témakörüzenetének lekéréséhez
Az értékesítési teljesítménnyel kapcsolatos üzeneteket lekérő összetevő létrehozásához hajtsa végre az alábbi lépéseket:
Futtassa
code .
a szerkesztő elindításához.A szerkesztőben nyissa meg a performancemessagereceiver/Program.cs fájlt, és keresse meg a következő kódsort:
const string ServiceBusConnectionString = "";
Az idézőjelek közé illessze be az előző gyakorlatban mentett kapcsolati sztring.
Service Bus-ügyfél létrehozásához keresse meg a metódust
MainAsync()
. Ezen a metóduson belül keresse meg a kód alábbi sorát:// Create a Service Bus client that will authenticate using a connection string
Írja felül ezt a sort az alábbi kóddal:
var client = new ServiceBusClient(ServiceBusConnectionString);
Az üzenetkezelési beállítások konfigurálásához keresse meg a következő kódsort:
// Create the options to use for configuring the processor
Írja felül ezt a sort az alábbi kóddal:
var processorOptions = new ServiceBusProcessorOptions { MaxConcurrentCalls = 1, AutoCompleteMessages = false };
Processzor létrehozásához keresse meg a következő kódsort:
// Create a processor that we can use to process the messages
Írja felül ezt a sort az alábbi kóddal:
ServiceBusProcessor processor = client.CreateProcessor(TopicName, SubscriptionName, processorOptions);
A kezelő konfigurálásához keresse meg a következő kódsort:
// Configure the message and error handler to use
Írja felül ezt a sort az alábbi kóddal:
processor.ProcessMessageAsync += MessageHandler; processor.ProcessErrorAsync += ErrorHandler;
A feldolgozás megkezdéséhez keresse meg a következő kódsort:
// Start processing
Írja felül ezt a sort az alábbi kóddal:
await processor.StartProcessingAsync();
Keresse meg a következő kódsort:
// Since we didn't use the "await using" syntax here, we need to explicitly dispose the processor and client
Cserélje le a sort a következő kódra:
await processor.DisposeAsync(); await client.DisposeAsync();
A bejövő üzenetek konzolon való megjelenítéséhez keresse meg a metódust
MessageHandler()
. Regisztrálta ezt a metódust a bejövő üzenetek kezeléséhez.Cserélje le a metóduson belüli összes kódot a következő kódra:
Console.WriteLine($"Received message: SequenceNumber:{args.Message.SequenceNumber} Body:{args.Message.Body}");
A fogadott üzenet előfizetésből való törléséhez a következő sorba írja be az alábbi kódot:
await args.CompleteMessageAsync(args.Message);
Ellenőrizze, hogy a végleges kód hasonlít-e a következő példára:
using System; using System.Text; using System.Threading; using System.Threading.Tasks; using Azure.Messaging.ServiceBus; namespace performancemessagereceiver { class Program { const string ServiceBusConnectionString = "Endpoint=sb://alexgeddyneil.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=LIWIyxs8baqQ0bRf5zJLef6OTfrv0kBEDxFM/ML37Zs="; const string TopicName = "salesperformancemessages"; const string SubscriptionName = "Americas"; static void Main(string[] args) { MainAsync().GetAwaiter().GetResult(); } static async Task MainAsync() { var client = new ServiceBusClient(ServiceBusConnectionString); Console.WriteLine("======================================================"); Console.WriteLine("Press ENTER key to exit after receiving all the messages."); Console.WriteLine("======================================================"); var processorOptions = new ServiceBusProcessorOptions { MaxConcurrentCalls = 1, AutoCompleteMessages = false }; ServiceBusProcessor processor = client.CreateProcessor(TopicName, SubscriptionName, processorOptions); processor.ProcessMessageAsync += MessageHandler; processor.ProcessErrorAsync += ErrorHandler; await processor.StartProcessingAsync(); Console.Read(); await processor.DisposeAsync(); await client.DisposeAsync(); } static async Task MessageHandler(ProcessMessageEventArgs args) { Console.WriteLine($"Received message: SequenceNumber:{args.Message.SequenceNumber} Body:{args.Message.Body}"); await args.CompleteMessageAsync(args.Message); } static Task ErrorHandler(ProcessErrorEventArgs args) { Console.WriteLine($"Message handler encountered an exception {args.Exception}."); Console.WriteLine("Exception context for troubleshooting:"); Console.WriteLine($"- Endpoint: {args.FullyQualifiedNamespace}"); Console.WriteLine($"- Entity Path: {args.EntityPath}"); Console.WriteLine($"- Executing Action: {args.ErrorSource}"); return Task.CompletedTask; } } }
A fájlt a Ctrl+S billentyűkombinációval mentse el, majd a Ctrl+Q billentyűkombinációval zárja be a szerkesztőt.
Témakörüzenet lekérése előfizetéshez
Az előfizetés értékesítési teljesítményével kapcsolatos üzenetet lekérő összetevő futtatásához futtassa a következő parancsot:
dotnet run --project performancemessagereceiver
A következőhöz hasonló kimenet fog megjelenni:
Received message: SequenceNumber:1 Body:Total sales for Brazil in August: $13m.
Amikor a program értesítéseket adott vissza arról, hogy üzeneteket fogad, nyomja le az Enter billentyűt az alkalmazás leállításához.
Az előfizetés üzenetének lekérése után ellenőrizze az üzenetek számát
Futtassa a következő parancsot annak ellenőrzéséhez, hogy nincsenek-e még üzenetek az Americas
előfizetésben. Mindenképpen cserélje le <a névtér nevét> a Service Bus-névtérre.
az servicebus topic subscription show \
--resource-group <rgn>[sandbox resource group name]</rgn> \
--topic-name salesperformancemessages \
--name Americas \
--query messageCount \
--namespace-name <namespace-name>
Ha ebben a kódban lecseréli Americas
EuropeAndAsia
az előfizetés aktuális üzenetszámátEuropeAndAsia
, látni fogja, hogy az üzenetszám .1
Az előző kódban csak Americas
a témakörüzenetek lekérésére lett beállítva, így az üzenet továbbra is a lekérésére EuropeAndAsia
vár.