Začínáme s tématy služby Service BusGet started with Service Bus topics

Tento kurz se zabývá následujícími kroky:This tutorial covers the following steps:

  1. Napíšeme konzolovou aplikaci .NET Core pro odeslání sady zpráv do tématu.Write a .NET Core console application to send a set of messages to the topic.
  2. Napíšeme konzolovou aplikaci .NET Core pro příjem těchto zpráv z odběru.Write a .NET Core console application to receive those messages from the subscription.

PožadavkyPrerequisites

  1. Předplatné Azure.An Azure subscription. K dokončení tohoto kurzu potřebujete mít účet Azure.To complete this tutorial, you need an Azure account. Můžete si aktivovat vaše výhody pro předplatitele sady Visual Studio nebo MSDN nebo zaregistrujte bezplatný účet.You can activate your Visual Studio or MSDN subscriber benefits or sign-up for a free account.
  2. Postupujte podle kroků v rychlý start: Pomocí webu Azure portal k vytvoření tématu služby Service Bus a odběrů na téma a proveďte následující úlohy:Follow steps in the Quickstart: Use the Azure portal to create a Service Bus topic and subscriptions to the topic to do the following tasks:
    1. Vytvoření služby Service Bus obor názvů.Create a Service Bus namespace.
    2. Získejte připojovací řetězec.Get the connection string.
    3. Vytvoření tématu v oboru názvů.Create a topic in the namespace.
    4. Vytvoření jedno předplatné téma v oboru názvů.Create one subscription to the topic in the namespace.
  3. Visual Studio 2017 s aktualizací Update 3 (verze 15.3, 26730.01) nebo novější.Visual Studio 2017 Update 3 (version 15.3, 26730.01) or later.
  4. NET Core SDK verze 2.0 nebo novější.NET Core SDK, version 2.0 or later.

Odesílání zpráv do tématuSend messages to the topic

Abychom mohli do tématu odesílat zprávy, napíšeme v sadě Visual Studio konzolovou aplikaci v jazyce C#.To send messages to the topic, write a C# console application using Visual Studio.

Vytvoření konzolové aplikaceCreate a console application

Spusťte sadu Visual Studio a vytvořte nový projekt Konzolová aplikace (.NET Core) .Launch Visual Studio and create a new Console App (.NET Core) project.

Přidání balíčku Service Bus NuGetAdd the Service Bus NuGet package

  1. Klikněte pravým tlačítkem na nově vytvořený projekt a vyberte možnost Spravovat balíčky NuGet.Right-click the newly created project and select Manage NuGet Packages.

  2. Klikněte na kartu Procházet, vyhledejte Microsoft.Azure.ServiceBus a pak vyberte položku Microsoft.Azure.ServiceBus.Click the Browse tab, search for Microsoft.Azure.ServiceBus, and then select the Microsoft.Azure.ServiceBus item. Klikněte na Instalovat a dokončete instalaci, pak zavřete dialogové okno.Click Install to complete the installation, then close this dialog box.

    Výběr balíčku NuGet

Napsání kódu pro odesílání zpráv do tématuWrite code to send messages to the topic

  1. V souboru Program.cs přidejte následující příkazy using do horní části definice oboru názvů před deklaraci třídy:In Program.cs, add the following using statements at the top of the namespace definition, before the class declaration:

    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using Microsoft.Azure.ServiceBus;
    
  2. V rámci třídy Program deklarujte následující proměnné.Within the Program class, declare the following variables. Nastavte proměnnou ServiceBusConnectionString na připojovací řetězec, který jste získali při vytváření oboru názvů, a proměnnou TopicName nastavte na název, který jste použili při vytváření tématu:Set the ServiceBusConnectionString variable to the connection string that you obtained when creating the namespace, and set TopicName to the name that you used when creating the topic:

    const string ServiceBusConnectionString = "<your_connection_string>";
    const string TopicName = "<your_topic_name>";
    static ITopicClient topicClient;
    
  3. Nahraďte výchozí obsah metody Main() následujícím řádkem kódu:Replace the default contents of Main() with the following line of code:

    MainAsync().GetAwaiter().GetResult();
    
  4. Přímo za metodu Main() přidejte následující asynchronní metodu MainAsync(), která volá metodu pro odeslání zpráv:Directly after Main(), add the following asynchronous MainAsync() method that calls the send messages method:

    static async Task MainAsync()
    {
        const int numberOfMessages = 10;
        topicClient = new TopicClient(ServiceBusConnectionString, TopicName);
    
        Console.WriteLine("======================================================");
        Console.WriteLine("Press ENTER key to exit after sending all the messages.");
        Console.WriteLine("======================================================");
    
        // Send messages.
        await SendMessagesAsync(numberOfMessages);
    
        Console.ReadKey();
    
        await topicClient.CloseAsync();
    }
    
  5. Přímo za metodu MainAsync() přidejte následující metodu SendMessagesAsync(), která provádí odeslání určitého počtu zpráv zadaného v proměnné numberOfMessagesToSend (aktuálně nastavená na hodnotu 10):Directly after the MainAsync() method, add the following SendMessagesAsync() method that performs the work of sending the number of messages specified by numberOfMessagesToSend (currently set to 10):

    static async Task SendMessagesAsync(int numberOfMessagesToSend)
    {
        try
        {
            for (var i = 0; i < numberOfMessagesToSend; i++)
            {
                // Create a new message to send to the topic.
                string messageBody = $"Message {i}";
                var message = new Message(Encoding.UTF8.GetBytes(messageBody));
    
                // Write the body of the message to the console.
                Console.WriteLine($"Sending message: {messageBody}");
    
                // Send the message to the topic.
                await topicClient.SendAsync(message);
            }
        }
        catch (Exception exception)
        {
            Console.WriteLine($"{DateTime.Now} :: Exception: {exception.Message}");
        }
    }
    
  6. Soubor Program.cs odesílatele by měl vypadat takto:Here is what your sender Program.cs file should look like.

    namespace CoreSenderApp
    {
        using System;
        using System.Text;
        using System.Threading;
        using System.Threading.Tasks;
        using Microsoft.Azure.ServiceBus;
    
        class Program
        {
            const string ServiceBusConnectionString = "<your_connection_string>";
            const string TopicName = "<your_topic_name>";
            static ITopicClient topicClient;
    
            static void Main(string[] args)
            {
                MainAsync().GetAwaiter().GetResult();
            }
    
            static async Task MainAsync()
            {
                const int numberOfMessages = 10;
                topicClient = new TopicClient(ServiceBusConnectionString, TopicName);
    
                Console.WriteLine("======================================================");
                Console.WriteLine("Press ENTER key to exit after sending all the messages.");
                Console.WriteLine("======================================================");
    
                // Send messages.
                await SendMessagesAsync(numberOfMessages);
    
                Console.ReadKey();
    
                await topicClient.CloseAsync();
            }
    
            static async Task SendMessagesAsync(int numberOfMessagesToSend)
            {
                try
                {
                    for (var i = 0; i < numberOfMessagesToSend; i++)
                    {
                        // Create a new message to send to the topic
                        string messageBody = $"Message {i}";
                        var message = new Message(Encoding.UTF8.GetBytes(messageBody));
    
                        // Write the body of the message to the console
                        Console.WriteLine($"Sending message: {messageBody}");
    
                        // Send the message to the topic
                        await topicClient.SendAsync(message);
                    }
                }
                catch (Exception exception)
                {
                    Console.WriteLine($"{DateTime.Now} :: Exception: {exception.Message}");
                }
            }
        }
    }
    
  7. Spusťte program a podívejte se na web Azure Portal: klikněte na název vašeho tématu v okně Přehled oboru názvů.Run the program, and check the Azure portal: click the name of your topic in the namespace Overview window. Zobrazí se obrazovka Základy tématu.The topic Essentials screen is displayed. Všimněte si, že v odběru uvedeném v dolní části okna je teď hodnota Počet zpráv pro odběr 10.In the subscription listed near the bottom of the window, notice that the Message Count value for the subscription is now 10. Pokaždé, když spustíte aplikaci odesílatele bez načtení zpráv (jak je popsáno v další části), se tato hodnota zvýší o 10.Each time you run the sender application without retrieving the messages (as described in the next section), this value increases by 10. Všimněte si také, že aktuální velikost tématu navyšuje hodnotu Aktuální v okně Základy pokaždé, když aplikace do daného tématu přidá zprávy.Also note that the current size of the topic increments the Current value in the Essentials window each time the app adds messages to the topic.

    Velikost zpráv

Příjem zpráv z odběruReceive messages from the subscription

Pokud chcete přijímat zprávy, které jste odeslali, vytvořte další konzolovou aplikaci .NET Core a nainstalujte Microsoft.Azure.ServiceBus balíček NuGet, podobně jako předtím u aplikace odesílatele.To receive the messages you sent, create another .NET Core console application and install the Microsoft.Azure.ServiceBus NuGet package, similar to the previous sender application.

Napsání kódu pro příjem zpráv z odběruWrite code to receive messages from the subscription

  1. V souboru Program.cs přidejte následující příkazy using do horní části definice oboru názvů před deklaraci třídy:In Program.cs, add the following using statements at the top of the namespace definition, before the class declaration:

    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using Microsoft.Azure.ServiceBus;
    
  2. V rámci třídy Program deklarujte následující proměnné.Within the Program class, declare the following variables. Nastavte proměnnou ServiceBusConnectionString na připojovací řetězec, který jste získali při vytváření oboru názvů, proměnnou TopicName nastavte na název, který jste použili při vytváření tématu, a proměnnou SubscriptionName nastavte na název, který jste použili při vytváření odběru tématu:Set the ServiceBusConnectionString variable to the connection string that you obtained when creating the namespace, set TopicName to the name that you used when creating the topic, and set SubscriptionName to the name that you used when creating the subscription to the topic:

    const string ServiceBusConnectionString = "<your_connection_string>";
    const string TopicName = "<your_topic_name>";
    const string SubscriptionName = "<your_subscription_name>";
    static ISubscriptionClient subscriptionClient;
    
  3. Nahraďte výchozí obsah metody Main() následujícím řádkem kódu:Replace the default contents of Main() with the following line of code:

    MainAsync().GetAwaiter().GetResult();
    
  4. Přímo za metodu Main() přidejte následující asynchronní metodu MainAsync(), která volá metodu RegisterOnMessageHandlerAndReceiveMessages():Directly after Main(), add the following asynchronous MainAsync() method that calls the RegisterOnMessageHandlerAndReceiveMessages() method:

    static async Task MainAsync()
    {
        subscriptionClient = new SubscriptionClient(ServiceBusConnectionString, TopicName, SubscriptionName);
    
        Console.WriteLine("======================================================");
        Console.WriteLine("Press ENTER key to exit after receiving all the messages.");
        Console.WriteLine("======================================================");
    
        // Register subscription message handler and receive messages in a loop
        RegisterOnMessageHandlerAndReceiveMessages();
    
        Console.ReadKey();
    
        await subscriptionClient.CloseAsync();
    }
    
  5. Přímo za metodu MainAsync() přidejte následující metodu, která registruje popisovač zprávy a přijímá zprávy odeslané aplikací odesílatele:Directly after the MainAsync() method, add the following method that registers the message handler and receives the messages sent by the sender application:

    static void RegisterOnMessageHandlerAndReceiveMessages()
    {
        // Configure the message handler options in terms of exception handling, number of concurrent messages to deliver, etc.
        var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler)
        {
            // Maximum number of concurrent calls to the callback ProcessMessagesAsync(), set to 1 for simplicity.
            // Set it according to how many messages the application wants to process in parallel.
            MaxConcurrentCalls = 1,
    
            // Indicates whether the message pump should automatically complete the messages after returning from user callback.
            // False below indicates the complete operation is handled by the user callback as in ProcessMessagesAsync().
            AutoComplete = false
        };
    
        // Register the function that processes messages.
        subscriptionClient.RegisterMessageHandler(ProcessMessagesAsync, messageHandlerOptions);
    }
    
  6. Přímo za předchozí metodu přidejte následující metodu ProcessMessagesAsync() pro zpracování přijatých zpráv:Directly after the previous method, add the following ProcessMessagesAsync() method to process the received messages:

    static async Task ProcessMessagesAsync(Message message, CancellationToken token)
    {
        // Process the message.
        Console.WriteLine($"Received message: SequenceNumber:{message.SystemProperties.SequenceNumber} Body:{Encoding.UTF8.GetString(message.Body)}");
    
        // Complete the message so that it is not received again.
        // This can be done only if the subscriptionClient is created in ReceiveMode.PeekLock mode (which is the default).
        await subscriptionClient.CompleteAsync(message.SystemProperties.LockToken);
    
        // Note: Use the cancellationToken passed as necessary to determine if the subscriptionClient has already been closed.
        // If subscriptionClient has already been closed, you can choose to not call CompleteAsync() or AbandonAsync() etc.
        // to avoid unnecessary exceptions.
    }
    
  7. Nakonec přidejte následující metodu, která zpracovává případné výjimky, ke kterým může dojít:Finally, add the following method to handle any exceptions that might occur:

    // Use this handler to examine the exceptions received on the message pump.
    static Task ExceptionReceivedHandler(ExceptionReceivedEventArgs exceptionReceivedEventArgs)
    {
        Console.WriteLine($"Message handler encountered an exception {exceptionReceivedEventArgs.Exception}.");
        var context = exceptionReceivedEventArgs.ExceptionReceivedContext;
        Console.WriteLine("Exception context for troubleshooting:");
        Console.WriteLine($"- Endpoint: {context.Endpoint}");
        Console.WriteLine($"- Entity Path: {context.EntityPath}");
        Console.WriteLine($"- Executing Action: {context.Action}");
        return Task.CompletedTask;
    }    
    
  8. Soubor Program.cs příjemce by měl vypadat takto:Here is what your receiver Program.cs file should look like:

    namespace CoreReceiverApp
    {
        using System;
        using System.Text;
        using System.Threading;
        using System.Threading.Tasks;
        using Microsoft.Azure.ServiceBus;
    
        class Program
        {
            const string ServiceBusConnectionString = "<your_connection_string>";
            const string TopicName = "<your_topic_name>";
            const string SubscriptionName = "<your_subscription_name>";
            static ISubscriptionClient subscriptionClient;
    
            static void Main(string[] args)
            {
                MainAsync().GetAwaiter().GetResult();
            }
    
            static async Task MainAsync()
            {
                subscriptionClient = new SubscriptionClient(ServiceBusConnectionString, TopicName, SubscriptionName);
    
                Console.WriteLine("======================================================");
                Console.WriteLine("Press ENTER key to exit after receiving all the messages.");
                Console.WriteLine("======================================================");
    
                // Register subscription message handler and receive messages in a loop.
                RegisterOnMessageHandlerAndReceiveMessages();
    
                Console.ReadKey();
    
                await subscriptionClient.CloseAsync();
            }
    
            static void RegisterOnMessageHandlerAndReceiveMessages()
            {
                // Configure the message handler options in terms of exception handling, number of concurrent messages to deliver, etc.
                var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler)
                {
                    // Maximum number of concurrent calls to the callback ProcessMessagesAsync(), set to 1 for simplicity.
                    // Set it according to how many messages the application wants to process in parallel.
                    MaxConcurrentCalls = 1,
    
                    // Indicates whether MessagePump should automatically complete the messages after returning from User Callback.
                    // False below indicates the Complete will be handled by the User Callback as in `ProcessMessagesAsync` below.
                    AutoComplete = false
                };
    
                // Register the function that processes messages.
                subscriptionClient.RegisterMessageHandler(ProcessMessagesAsync, messageHandlerOptions);
            }
    
            static async Task ProcessMessagesAsync(Message message, CancellationToken token)
            {
                // Process the message.
                Console.WriteLine($"Received message: SequenceNumber:{message.SystemProperties.SequenceNumber} Body:{Encoding.UTF8.GetString(message.Body)}");
    
                // Complete the message so that it is not received again.
                // This can be done only if the subscriptionClient is created in ReceiveMode.PeekLock mode (which is the default).
                await subscriptionClient.CompleteAsync(message.SystemProperties.LockToken);
    
                // Note: Use the cancellationToken passed as necessary to determine if the subscriptionClient has already been closed.
                // If subscriptionClient has already been closed, you can choose to not call CompleteAsync() or AbandonAsync() etc.
                // to avoid unnecessary exceptions.
            }
    
            static Task ExceptionReceivedHandler(ExceptionReceivedEventArgs exceptionReceivedEventArgs)
            {
                Console.WriteLine($"Message handler encountered an exception {exceptionReceivedEventArgs.Exception}.");
                var context = exceptionReceivedEventArgs.ExceptionReceivedContext;
                Console.WriteLine("Exception context for troubleshooting:");
                Console.WriteLine($"- Endpoint: {context.Endpoint}");
                Console.WriteLine($"- Entity Path: {context.EntityPath}");
                Console.WriteLine($"- Executing Action: {context.Action}");
                return Task.CompletedTask;
            }
        }
    }
    
  9. Spusťte program a znovu se podívejte na portál.Run the program, and check the portal again. Všimněte si, že hodnoty Počet zpráv a Aktuální jsou nyní 0.Notice that the Message Count and Current values are now 0.

    Délka tématu

Blahopřejeme!Congratulations! Právě jste s použitím knihovny .NET Standard vytvořili téma a odběr, odeslali 10 zpráv a přijali tyto zprávy.Using the .NET Standard library, you have now created a topic and subscription, sent 10 messages, and received those messages.

Poznámka

Můžete spravovat prostředky služby Service Bus s Service Bus Exploreru.You can manage Service Bus resources with Service Bus Explorer. Service Bus Exploreru umožňuje uživatelům připojit k oboru názvů služby Service Bus a správě entit pro zasílání zpráv snadno způsobem.The Service Bus Explorer allows users to connect to a Service Bus namespace and administer messaging entities in an easy manner. Tento nástroj nabízí pokročilé funkce, například funkce importu/exportu nebo možnost otestovat tématu, fronty, předplatná, služby pro přenos přes, notification hubs a centra událostí.The tool provides advanced features like import/export functionality or the ability to test topic, queues, subscriptions, relay services, notification hubs and events hubs.

Další postupNext steps

Podívejte se na úložiště GitHub s ukázkami pro Service Bus, které předvádějí některé pokročilejší funkce zasílání zpráv služby Service Bus.Check out the Service Bus GitHub repository with samples that demonstrate some of the more advanced features of Service Bus messaging.