Sdílet prostřednictvím


Odesílání zpráv do front služby Azure Service Bus a příjem zpráv (Java)

Tento rychlý start obsahuje podrobné pokyny pro jednoduchý scénář odesílání zpráv do fronty služby Service Bus a jejich příjem. Vytvoříte aplikaci v Javě, která bude posílat zprávy a přijímat zprávy z fronty služby Azure Service Bus. Předem připravené ukázky Java pro Azure Service Bus najdete v úložišti Azure SDK pro Javu na GitHubu.

Návod

Pokud pracujete s prostředky Azure Service Bus v aplikaci Spring, doporučujeme 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řit obor názvů v Azure portálu

Pokud chcete začít používat entity zasílání zpráv Service Bus v Azure, vytvořte obor názvů s názvem, který je jedinečný v rámci Azure. Obor názvů poskytuje kontejner oborů pro prostředky služby Service Bus, jako jsou fronty a témata, ve vaší aplikaci.

Chcete-li vytvořit obor názvů:

  1. Přihlaste se do Azure Portalu.

  2. V levém horním rohu vyberte kontextovou nabídku a přejděte na stránku Všechny služby.

  3. Na levém navigačním panelu vyberte Integrace.

  4. Posuňte se dolů ke službám zasílání zpráv>Service Bus a vyberte Vytvořit.

    Snímek obrazovky znázorňující výběr možnosti Vytvořit prostředek, integraci a potom Service Bus v nabídce

  5. Na kartě Základy na stránce Vytvořit obor názvů postupujte podle těchto kroků:

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

    2. Pro skupinu prostředků zvolte existující skupinu prostředků nebo vytvořte novou.

    3. Zadejte název oboru názvů, který splňuje následující konvence pojmenování.

      • 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 pro hostování vašeho oboru názvů.

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

      Pokud vyberete úroveň Premium , můžete pro obor názvů povolit geografickou replikaci . Funkce geografické replikace zajišťuje, aby se metadata a data oboru názvů průběžně replikovaly z primární oblasti do jedné nebo více sekundárních oblastí.

      Důležité

      Pokud chcete použít témata a předplatná, zvolte Standard nebo Premium. Témata a 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. Namespace Premium má alespoň jednu jednotku pro 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 Úroveň zasílání zpráv služby Service Bus úrovně Premium.

    6. Vyberte Review + create dole na stránce.

      Snímek obrazovky zobrazující stránku pro vytvoření oboru názvů

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

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

    Snímek obrazovky zobrazující stránku s informací o úspěšném nasazení s odkazem

  7. Zobrazí se domovská stránka vašeho prostředí sběrnice služeb.

    Snímek obrazovky znázorňující domovskou stránku vytvořeného oboru názvů služby Service Bus

Vytvořte frontu v Azure portálu

  1. Na stránce Obor názvů Service Bus rozbalte Entity v navigační nabídce vlevo a vyberte Fronty.

  2. Na stránce Fronty na panelu nástrojů vyberte + Fronta.

  3. Zadejte název fronty. U ostatních hodnot ponechte výchozí hodnoty.

  4. Vyberte Vytvořit.

    Snímek obrazovky, který zobrazuje stránku Vytvořit frontu.

Ověření aplikace v Azure

Tento článek ukazuje dva způsoby připojení ke službě Azure Service Bus: bez hesla a připojovací řetězec.

První možnost vám ukáže, jak použít váš hlavní objekt zabezpečení v Microsoft Entra ID a řízení přístupu na základě role (RBAC) pro připojení k oboru názvů služby Service Bus. Nemusíte si dělat starosti s pevně zakódovaným připojovacím řetězcem v kódu, v konfiguračním souboru nebo v zabezpečeném úložišti, jako je Azure Key Vault.

Druhá možnost ukazuje, jak pomocí připojovacího řetězce provést připojení 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 je 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 služby Service Bus. Další informace o ověřování bez hesla najdete v tématu Ověřování aplikací .NET.

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 potřebujete roli Vlastník dat služby Azure Service Bus . K přiřazení této role potřebujete roli Správce uživatelských přístupů nebo jinou roli, která tuto Microsoft.Authorization/roleAssignments/write akci zahrnuje.

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 v tématu Vysvětlení rozsahu pro Azure RBAC.

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í a udělte uživatelům 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 Azure Portalu a rozhraní pro správu prostředků Azure již chráněna 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:

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 pro Azure Service Bus na úrovni oboru názvů Service Bus. Tato konfigurace umožňuje aplikaci, která běží v kontextu uživatelského účtu, odesílat zprávy do fronty nebo tématu. Může přijímat zprávy z fronty nebo z odběru k tématu.

Důležité

Ve většině případů trvá přiřazení role v Azure minutu nebo dvě. 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řehled 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 pak přidejte přiřazení role.

    Snímek obrazovky znázorňující, jak přiřadit roli

  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, abyste přešli na poslední stránku, a poté znovu vyberte Zkontrolovat a přiřadit, abyste dokončili proces.

Zasílání zpráv do fronty

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

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ů . 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řidejte kód pro odesílání zpráv do fronty

  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é pro uložení připojovacího řetězce a názvu fronty.

    static String queueName = "<QUEUE NAME>";
    

    Důležité

    Nahraďte <QUEUE NAME> názvem fronty.

  3. Ve třídě přidejte metodu pojmenovanou sendMessage, která odešle jednu zprávu do fronty.

    Důležité

    Nahraďte NAMESPACENAME názvem vašeho oboru názvů v rámci 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()
                .queueName(queueName)
                .buildClient();
    
        // send one message to the queue
        senderClient.sendMessage(new ServiceBusMessage("Hello, World!"));
        System.out.println("Sent a single message to the queue: " + queueName);
    }
    
    
  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. V tomto příkladu použijete 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 fronty, kterou jste vytvořili. Tato metoda vytvoří pro frontu ServiceBusSenderClient, vyvolá metodu createMessages pro získání seznamu zpráv, připraví jednu nebo více dávek a tyto dávky odešle do fronty.

    Důležité

    Nahraďte NAMESPACENAME názvem vašeho oboru názvů v rámci 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()
                .queueName(queueName)
                .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 queue: " + queueName);
    
            // 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 queue: " + queueName);
        }
    
        //close the client
        senderClient.close();
    }
    

Příjem zpráv z fronty

V této části přidáte kód pro načtení zpráv z fronty.

  1. Přidejte metodu pojmenovanou receiveMessages pro příjem zpráv z fronty. Tato metoda vytvoří pro frontu ServiceBusProcessorClient zadáním obslužné rutiny pro zpracování zpráv a jinou 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ů v rámci služby Service Bus.
    // handles received messages
    static void receiveMessages() throws InterruptedException
    {
        DefaultAzureCredential credential = new DefaultAzureCredentialBuilder()
                .build();
    
        ServiceBusProcessorClient processorClient = new ServiceBusClientBuilder()
                .fullyQualifiedNamespace("NAMESPACENAME.servicebus.windows.net")
                .credential(credential)
                .processor()
                .queueName(queueName)
                .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();
    }
    

Spuštění aplikace

  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 přihlášení pod uživatelským účtem, který se liší od účtu, který jste přidali do role Vlastník dat služby Azure Service Bus , postupujte takto. V opačném případě přejděte k spuštění souboru Jar v dalším kroku.

    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 queue: myqueue
    Sent a batch of messages to the queue: myqueue
    Starting the processor
    Processing message. Session: 88d961dd801f449e9c3e0f8a5393a527, Sequence #: 1. Contents: Hello, World!
    Processing message. Session: e90c8d9039ce403bbe1d0ec7038033a0, Sequence #: 2. Contents: First message
    Processing message. Session: 311a216a560c47d184f9831984e6ac1d, Sequence #: 3. Contents: Second message
    Processing message. Session: f9a871be07414baf9505f2c3d466c4ab, Sequence #: 4. Contents: Third message
    Stopping and closing the processor
    

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.

Snímek obrazovky ukazuje počet příchozích a odchozích zpráv.

Výběrem fronty na této stránce Přehled přejděte na stránku Fronta služby Service Bus. Na této stránce se zobrazuje také počet příchozích a odchozích zpráv. Zobrazí se také další informace, jako je aktuální velikost fronty a maximální velikostaktivního počtu zpráv.

Snímek obrazovky zobrazuje podrobnosti fronty zpráv určené této frontě.

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