Odesílání zpráv do tématu služby Azure Service Bus a příjem zpráv z odběrů do tématu (Java)

V tomto rychlém startu napíšete kód Java pomocí balíčku azure-messaging-servicebus k odesílání zpráv do tématu služby Azure Service Bus a přijímání zpráv z odběrů do tohoto tématu.

Poznámka:

Tento rychlý start obsahuje podrobné pokyny pro jednoduchý scénář odeslání dávky zpráv do tématu služby Service Bus a příjem těchto zpráv z odběru tématu. Předdefinované ukázky v Javě pro Azure Service Bus najdete v úložišti Azure SDK pro Javu na GitHubu.

Tip

Pokud pracujete s prostředky Azure Service Bus v aplikaci Spring, doporučujeme jako alternativu zvážit Spring Cloud Azure . Spring Cloud Azure je opensourcový projekt, který poskytuje bezproblémovou integraci Spring se službami Azure. Další informace o Službě Spring Cloud Azure a příklad použití služby Service Bus najdete v tématu Spring Cloud Stream se službou Azure Service Bus.

Požadavky

Vytvoření oboru názvů na webu Azure Portal

Pokud chcete začít používat entity zasílání zpráv služby Service Bus v Azure, musíte nejprve vytvořit obor názvů s jedinečným názvem v rámci Azure. Obor názvů poskytuje kontejner oborů pro prostředky služby Service Bus (fronty, témata atd.) v rámci vaší aplikace.

Vytvoření oboru názvů:

  1. Přihlaste se k portálu Azure.

  2. Přejděte na stránku Všechny služby.

  3. Na levém navigačním panelu vyberte Možnost Integrace ze seznamu kategorií, najeďte myší na Service Bus a pak vyberte + tlačítko na dlaždici Service Bus.

    Image showing selection of Create a resource, Integration, and then Service Bus in the menu.

  4. Na stránce Základy na stránce Vytvořit obor názvů postupujte takto:

    1. V části Předplatné zvolte předplatné Azure, ve kterém chcete vytvořit obor názvů.

    2. V části Skupina prostředků zvolte existující skupinu prostředků, ve které bude obor názvů aktivní, nebo vytvořte novou.

    3. Zadejte název oboru názvů. Název oboru názvů by měl dodržovat následující zásady vytváření názvů:

      • Název musí být jedinečný v rámci Azure. Systém okamžitě kontroluje, jestli je název dostupný.
      • Délka názvu je nejméně 6 a maximálně 50 znaků.
      • Název může obsahovat pouze písmena, číslice, pomlčky -.
      • Název musí začínat písmenem a končit písmenem nebo číslem.
      • Název nekončí "-sb" nebo "-mgmt".
    4. V části Umístění zvolte oblast, ve které má být váš obor názvů hostovaný.

    5. V části Cenová úroveň vyberte cenovou úroveň (Basic, Standard nebo Premium) pro obor názvů. Pro účely tohoto rychlého startu vyberte Standard.

      Důležité

      Pokud chcete použít témata a předplatná, zvolte Standard nebo Premium. Témata nebo předplatná se nepodporují v cenové úrovni Basic.

      Pokud jste vybrali cenovou úroveň Premium , zadejte počet jednotek zasílání zpráv. Úroveň Premium poskytuje izolaci prostředků na úrovni procesoru a paměti, aby každá úloha běžela izolovaně. Kontejner prostředků se nazývá jednotka zasílání zpráv. Obor názvů premium má alespoň jednu jednotku zasílání zpráv. Pro každý obor názvů služby Service Bus Premium můžete vybrat 1, 2, 4, 8 nebo 16 jednotek zasílání zpráv. Další informace najdete v tématu Zasílání zpráv Service Bus Premium.

    6. Vyberte Zkontrolovat a vytvořit v dolní části stránky.

      Image showing the Create a namespace page

    7. Na stránce Zkontrolovat a vytvořit zkontrolujte nastavení a vyberte Vytvořit.

  5. Po úspěšném nasazení prostředku vyberte na stránce nasazení možnost Přejít k prostředku .

    Image showing the deployment succeeded page with the Go to resource link.

  6. Zobrazí se domovská stránka vašeho oboru názvů služby Service Bus.

    Image showing the home page of the Service Bus namespace created.

Vytvoření tématu pomocí webu Azure Portal

  1. Na stránce Obor názvů služby Service Bus vyberte Témata v nabídce vlevo.

  2. Na panelu nástrojů vyberte + Téma .

  3. Zadejte název tématu. U ostatních možností ponechte jejich výchozí hodnoty.

  4. Vyberte Vytvořit.

    Image showing the Create topic page.

Vytvoření odběru tématu

  1. Vyberte téma, které jste vytvořili v předchozí části.

    Image showing the selection of topic from the list of topics.

  2. Na stránce Téma služby Service Bus vyberte na panelu nástrojů možnost + Předplatné.

    Image showing the Add subscription button.

  3. Na stránce Vytvořit předplatné postupujte takto:

    1. Jako název předplatného zadejte S1.

    2. Zadejte 3 pro maximální počet doručení.

    3. Potom vyberte Vytvořit a vytvořte předplatné.

      Image showing the Create subscription page.

Ověření aplikace v Azure

Tento rychlý start ukazuje dva způsoby připojení ke službě Azure Service Bus: bez hesla a připojovací řetězec.

První možnost ukazuje, jak se pomocí objektu zabezpečení v Microsoft Entra ID a řízení přístupu na základě role (RBAC) připojit k oboru názvů služby Service Bus. Nemusíte se starat o pevně zakódované připojovací řetězec v kódu nebo v konfiguračním souboru nebo v zabezpečeném úložišti, jako je Azure Key Vault.

Druhá možnost ukazuje, jak se pomocí připojovací řetězec připojit k oboru názvů služby Service Bus. Pokud s Azure začínáte, možná zjistíte, že připojovací řetězec možnost bude jednodušší postupovat. Doporučujeme používat možnost bez hesla v reálných aplikacích a produkčních prostředích. Další informace najdete v tématu Ověřování a autorizace. Další informace o ověřování bez hesla najdete na stránce přehledu.

Přiřazení rolí uživateli Microsoft Entra

Při místním vývoji se ujistěte, že uživatelský účet, který se připojuje ke službě Azure Service Bus, má správná oprávnění. K odesílání a příjmu zpráv budete potřebovat roli Vlastník dat služby Azure Service Bus. K přiřazení této role budete potřebovat roli Uživatelský přístup Správa istrator nebo jinou roli, která tuto akci zahrnujeMicrosoft.Authorization/roleAssignments/write. Role Azure RBAC můžete uživateli přiřadit pomocí webu Azure Portal, Azure CLI nebo Azure PowerShellu. Další informace o dostupných oborech pro přiřazení rolí najdete na stránce přehledu oboru.

Následující příklad přiřadí roli k vašemu uživatelskému Azure Service Bus Data Owner účtu, který poskytuje úplný přístup k prostředkům služby Azure Service Bus. V reálném scénáři postupujte podle principu nejnižšího oprávnění , aby uživatelům poskytla pouze minimální oprávnění potřebná pro bezpečnější produkční prostředí.

Předdefinované role Azure pro Azure Service Bus

Pro Službu Azure Service Bus je správa oborů názvů a všech souvisejících prostředků prostřednictvím webu Azure Portal a rozhraní API pro správu prostředků Azure už chráněná pomocí modelu Azure RBAC. Azure poskytuje následující předdefinované role Azure pro autorizaci přístupu k oboru názvů služby Service Bus:

  • Vlastník dat služby Azure Service Bus: Umožňuje přístup k datům k oboru názvů služby Service Bus a jeho entitám (fronty, témata, odběry a filtry). Člen této role může odesílat a přijímat zprávy z front nebo témat nebo odběrů.
  • Odesílatel dat služby Azure Service Bus: Pomocí této role můžete udělit přístup k oboru názvů služby Service Bus a jeho entitám.
  • Příjemce dat služby Azure Service Bus: Pomocí této role můžete udělit přístup k oboru názvů služby Service Bus a jeho entitám.

Pokud chcete vytvořit vlastní roli, přečtěte si téma Práva potřebná pro operace služby Service Bus.

Přidání uživatele Microsoft Entra do role vlastníka služby Azure Service Bus

Přidejte své uživatelské jméno Microsoft Entra do role Vlastník dat služby Azure Service Bus na úrovni oboru názvů služby Service Bus. Umožní aplikaci spuštěnou v kontextu vašeho uživatelského účtu odesílat zprávy do fronty nebo tématu a přijímat zprávy z fronty nebo odběru tématu.

Důležité

Ve většině případů bude trvat minutu nebo dvě, než se přiřazení role rozšíří v Azure. Ve výjimečných případech může trvat až osm minut. Pokud při prvním spuštění kódu dojde k chybám ověřování, chvíli počkejte a zkuste to znovu.

  1. Pokud nemáte na webu Azure Portal otevřenou stránku Obor názvů služby Service Bus, najděte obor názvů služby Service Bus pomocí hlavního vyhledávacího panelu nebo levé navigace.

  2. Na stránce přehledu vyberte v nabídce vlevo řízení přístupu (IAM ).

  3. Na stránce Řízení přístupu (IAM) vyberte kartu Přiřazení rolí.

  4. V horní nabídce vyberte + Přidat a potom přidejte přiřazení role z výsledné rozevírací nabídky.

    A screenshot showing how to assign a role.

  5. Pomocí vyhledávacího pole vyfiltrujte výsledky podle požadované role. V tomto příkladu vyhledejte Azure Service Bus Data Owner a vyberte odpovídající výsledek. Pak zvolte Další.

  6. V části Přiřadit přístup vyberte Uživatel, skupina nebo instanční objekt a pak zvolte + Vybrat členy.

  7. V dialogovém okně vyhledejte své uživatelské jméno Microsoft Entra (obvykle vaše user@domain e-mailová adresa) a pak v dolní části dialogového okna zvolte Vybrat .

  8. Vyberte Zkontrolovat a přiřadit přejděte na poslední stránku a pak proces dokončete opětovnou kontrolou a přiřazením .

Odeslání zprávy do tématu

V této části vytvoříte projekt konzoly Java a přidáte kód pro odesílání zpráv do tématu, které jste vytvořili.

Vytvoření projektu konzoly Java

Vytvořte projekt Java pomocí Eclipse nebo libovolného nástroje.

Konfigurace aplikace pro použití služby Service Bus

Přidejte odkazy na knihovny Azure Core a Azure Service Bus.

Pokud používáte Eclipse a vytváříte konzolovou aplikaci Java, převeďte projekt Java na Maven: klikněte pravým tlačítkem na projekt v okně Průzkumník balíčků a vyberte Konfigurovat ->Převést na projekt Maven. Potom do těchto dvou knihoven přidejte závislosti, jak je znázorněno v následujícím příkladu.

pom.xml Aktualizujte soubor tak, aby se přidaly závislosti do balíčků Azure Service Bus a Azure Identity.

    <dependencies>
        <dependency>
            <groupId>com.azure</groupId>
            <artifactId>azure-messaging-servicebus</artifactId>
            <version>7.13.3</version>
        </dependency>
        <dependency>
            <groupId>com.azure</groupId>
            <artifactId>azure-identity</artifactId>
            <version>1.8.0</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

Přidání kódu pro odesílání zpráv do tématu

  1. Do tématu souboru Java přidejte následující import příkazy.

    import com.azure.messaging.servicebus.*;
    import com.azure.identity.*;
    
    import java.util.concurrent.TimeUnit;
    import java.util.Arrays;
    import java.util.List;
    
  2. Ve třídě definujte proměnné, které mají uchovávat připojovací řetězec (není potřeba pro scénář bez hesla), název tématu a název předplatného.

    static String topicName = "<TOPIC NAME>";
    static String subName = "<SUBSCRIPTION NAME>";
    

    Důležité

    Nahraďte <TOPIC NAME> názvem tématu a <SUBSCRIPTION NAME> názvem odběru tématu.

  3. Přidejte metodu pojmenovanou sendMessage ve třídě pro odeslání jedné zprávy do tématu.

    Důležité

    Nahraďte NAMESPACENAME názvem vašeho oboru názvů služby Service Bus.

    static void sendMessage()
    {
        // create a token using the default Azure credential
        DefaultAzureCredential credential = new DefaultAzureCredentialBuilder()
                .build();
    
        ServiceBusSenderClient senderClient = new ServiceBusClientBuilder()
                .fullyQualifiedNamespace("NAMESPACENAME.servicebus.windows.net")
                .credential(credential)
                .sender()
                .topicName(topicName)
                .buildClient();
    
        // send one message to the topic
        senderClient.sendMessage(new ServiceBusMessage("Hello, World!"));
        System.out.println("Sent a single message to the topic: " + topicName);
    }
    
    
  4. Přidejte metodu pojmenovanou createMessages ve třídě, která vytvoří seznam zpráv. Tyto zprávy obvykle získáte z různých částí aplikace. Tady vytvoříme seznam ukázkových zpráv.

    static List<ServiceBusMessage> createMessages()
    {
        // create a list of messages and return it to the caller
        ServiceBusMessage[] messages = {
                new ServiceBusMessage("First message"),
                new ServiceBusMessage("Second message"),
                new ServiceBusMessage("Third message")
        };
        return Arrays.asList(messages);
    }
    
  5. Přidejte metodu pojmenovanou sendMessageBatch metodu pro odesílání zpráv do tématu, které jste vytvořili. Tato metoda vytvoří ServiceBusSenderClient pro téma, vyvolá metodu createMessages pro získání seznamu zpráv, připraví jednu nebo více dávek a odešle dávky do tématu.

    Důležité

    Nahraďte NAMESPACENAME názvem vašeho oboru názvů služby Service Bus.

    static void sendMessageBatch()
    {
        // create a token using the default Azure credential
        DefaultAzureCredential credential = new DefaultAzureCredentialBuilder()
                .build();
    
        ServiceBusSenderClient senderClient = new ServiceBusClientBuilder()
                .fullyQualifiedNamespace("NAMESPACENAME.servicebus.windows.net")
                .credential(credential)
                .sender()
                .topicName(topicName)
                .buildClient();
    
        // Creates an ServiceBusMessageBatch where the ServiceBus.
        ServiceBusMessageBatch messageBatch = senderClient.createMessageBatch();
    
        // create a list of messages
        List<ServiceBusMessage> listOfMessages = createMessages();
    
        // We try to add as many messages as a batch can fit based on the maximum size and send to Service Bus when
        // the batch can hold no more messages. Create a new batch for next set of messages and repeat until all
        // messages are sent.
        for (ServiceBusMessage message : listOfMessages) {
            if (messageBatch.tryAddMessage(message)) {
                continue;
            }
    
            // The batch is full, so we create a new batch and send the batch.
            senderClient.sendMessages(messageBatch);
            System.out.println("Sent a batch of messages to the topic: " + topicName);
    
            // create a new batch
            messageBatch = senderClient.createMessageBatch();
    
            // Add that message that we couldn't before.
            if (!messageBatch.tryAddMessage(message)) {
                System.err.printf("Message is too large for an empty batch. Skipping. Max size: %s.", messageBatch.getMaxSizeInBytes());
            }
        }
    
        if (messageBatch.getCount() > 0) {
            senderClient.sendMessages(messageBatch);
            System.out.println("Sent a batch of messages to the topic: " + topicName);
        }
    
        //close the client
        senderClient.close();
    }
    

Příjem zpráv z odběru

V této části přidáte kód pro načtení zpráv z odběru do tématu.

  1. Přidejte metodu pojmenovanou receiveMessages pro příjem zpráv z odběru. Tato metoda vytvoří ServiceBusProcessorClient pro odběr zadáním obslužné rutiny pro zpracování zpráv a další pro zpracování chyb. Potom spustí procesor, počká několik sekund, vytiskne přijaté zprávy a pak procesor zastaví a zavře.

    Důležité

    • Nahraďte NAMESPACENAME názvem vašeho oboru názvů služby Service Bus.
    • Nahraďte ServiceBusTopicTest v ServiceBusTopicTest::processMessage kódu názvem předmětu.
    // handles received messages
    static void receiveMessages() throws InterruptedException
    {
        DefaultAzureCredential credential = new DefaultAzureCredentialBuilder()
                .build();
    
        // Create an instance of the processor through the ServiceBusClientBuilder
        ServiceBusProcessorClient processorClient = new ServiceBusClientBuilder()
            .fullyQualifiedNamespace("NAMESPACENAME.servicebus.windows.net")
            .credential(credential)
            .processor()
            .topicName(topicName)
            .subscriptionName(subName)
            .processMessage(context -> processMessage(context))
            .processError(context -> processError(context))
            .buildProcessorClient();
    
        System.out.println("Starting the processor");
        processorClient.start();
    
        TimeUnit.SECONDS.sleep(10);
        System.out.println("Stopping and closing the processor");
        processorClient.close();
    }
    
  2. Přidejte metodu processMessage pro zpracování zprávy přijaté z odběru služby Service Bus.

    private static void processMessage(ServiceBusReceivedMessageContext context) {
        ServiceBusReceivedMessage message = context.getMessage();
        System.out.printf("Processing message. Session: %s, Sequence #: %s. Contents: %s%n", message.getMessageId(),
            message.getSequenceNumber(), message.getBody());
    }
    
  3. Přidejte metodu processError pro zpracování chybových zpráv.

    private static void processError(ServiceBusErrorContext context) {
        System.out.printf("Error when receiving messages from namespace: '%s'. Entity: '%s'%n",
            context.getFullyQualifiedNamespace(), context.getEntityPath());
    
        if (!(context.getException() instanceof ServiceBusException)) {
            System.out.printf("Non-ServiceBusException occurred: %s%n", context.getException());
            return;
        }
    
        ServiceBusException exception = (ServiceBusException) context.getException();
        ServiceBusFailureReason reason = exception.getReason();
    
        if (reason == ServiceBusFailureReason.MESSAGING_ENTITY_DISABLED
            || reason == ServiceBusFailureReason.MESSAGING_ENTITY_NOT_FOUND
            || reason == ServiceBusFailureReason.UNAUTHORIZED) {
            System.out.printf("An unrecoverable error occurred. Stopping processing with reason %s: %s%n",
                reason, exception.getMessage());
        } else if (reason == ServiceBusFailureReason.MESSAGE_LOCK_LOST) {
            System.out.printf("Message lock lost for message: %s%n", context.getException());
        } else if (reason == ServiceBusFailureReason.SERVICE_BUSY) {
            try {
                // Choosing an arbitrary amount of time to wait until trying again.
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                System.err.println("Unable to sleep for period of time");
            }
        } else {
            System.out.printf("Error source %s, reason %s, message: %s%n", context.getErrorSource(),
                reason, context.getException());
        }
    }
    
  4. Aktualizujte metodu main pro vyvolání sendMessage, sendMessageBatcha receiveMessages metody a vyvolání InterruptedException.

    public static void main(String[] args) throws InterruptedException {
        sendMessage();
        sendMessageBatch();
        receiveMessages();
    }
    

Spustit aplikaci

Spuštěním programu zobrazte výstup podobný následujícímu výstupu:

  1. Pokud používáte Eclipse, klikněte pravým tlačítkem myši na projekt, vyberte Exportovat, rozbalte Javu, vyberte Spustitelný soubor JAR a podle pokynů vytvořte spustitelný soubor JAR.

  2. Pokud jste k počítači přihlášení pomocí uživatelského účtu, který se liší od uživatelského účtu přidaného do role Vlastník dat služby Azure Service Bus, postupujte takto. V opačném případě tento krok přeskočte a v dalším kroku přejděte ke spuštění souboru Jar.

    1. Nainstalujte azure CLI na svůj počítač.

    2. Spuštěním následujícího příkazu rozhraní příkazového řádku se přihlaste k Azure. Použijte stejný uživatelský účet, který jste přidali do role Vlastník dat služby Azure Service Bus.

      az login
      
  3. Spusťte soubor Jar pomocí následujícího příkazu.

    java -jar <JAR FILE NAME>
    
  4. V okně konzoly se zobrazí následující výstup.

    Sent a single message to the topic: mytopic
    Sent a batch of messages to the topic: mytopic
    Starting the processor
    Processing message. Session: e0102f5fbaf646988a2f4b65f7d32385, Sequence #: 1. Contents: Hello, World!
    Processing message. Session: 3e991e232ca248f2bc332caa8034bed9, Sequence #: 2. Contents: First message
    Processing message. Session: 56d3a9ea7df446f8a2944ee72cca4ea0, Sequence #: 3. Contents: Second message
    Processing message. Session: 7bd3bd3e966a40ebbc9b29b082da14bb, Sequence #: 4. Contents: Third message
    

Na stránce Přehled oboru názvů služby Service Bus na webu Azure Portal můžete zobrazit počet příchozích a odchozích zpráv. Počkejte minutu nebo tak a pak aktualizujte stránku, aby se zobrazily nejnovější hodnoty.

Incoming and outgoing message count

V prostředním podokně přepněte na kartu Témata a výběrem tématu zobrazte stránku Téma služby Service Bus pro vaše téma. Na této stránce byste měli vidět čtyři příchozí a čtyři odchozí zprávy v grafu Zprávy .

Incoming and outgoing messages

Pokud zakomentujete receiveMessages volání v main metodě a spustíte aplikaci znovu, na stránce Téma služby Service Bus uvidíte 8 příchozích zpráv (4 nové), ale čtyři odchozí zprávy.

Updated topic page

Pokud na této stránce vyberete předplatné, dostanete se na stránku Předplatné služby Service Bus. Na této stránce můžete vidět počet aktivních zpráv, počet nedoručených zpráv a další informace. V tomto příkladu jsou čtyři aktivní zprávy, které příjemce ještě nepřijal.

Active message count

Další kroky

Projděte si následující dokumentaci a ukázky: