Berichten verzenden naar een Azure Service Bus-onderwerp en berichten ontvangen van abonnementen op het onderwerp (Java)

In deze quickstart schrijft u Java-code die het pakket azure-messaging-servicebus gebruikt voor het verzenden van berichten naar een Azure Service Bus-onderwerp en ontvangt u vervolgens berichten van abonnementen op dit onderwerp.

Notitie

Deze quickstart bevat stapsgewijze instructies voor een eenvoudig scenario voor het verzenden van een batch berichten naar een Service Bus-onderwerp en het ontvangen van die berichten uit een abonnement op het onderwerp. U vindt vooraf gebouwde Java-voorbeelden voor Azure Service Bus in de Azure SDK voor Java-opslagplaats op GitHub.

Tip

Als u met Azure Service Bus-resources in een Spring-toepassing werkt, raden we u aan Spring Cloud Azure als alternatief te beschouwen. Spring Cloud Azure is een opensource-project dat naadloze Spring-integratie met Azure-services biedt. Zie Spring Cloud Stream met Azure Service Bus voor meer informatie over Spring Cloud Azure en voor een voorbeeld met Service Bus.

Vereisten

Een naamruimte in de Azure-portal maken

Als u Service Bus-berichtenentiteiten wilt gebruiken in Azure, moet u eerst een naamruimte maken met een naam die uniek is binnen Azure. Een naamruimte biedt een bereikcontainer voor Service Bus-resources (wachtrijen, onderwerpen, enzovoort) in uw toepassing.

Ga als volgt te werk om een naamruimte te maken:

  1. Meld u aan bij het Azure-portaal.

  2. Navigeer naar de pagina Alle services.

  3. Selecteer integratie in de linkernavigatiebalk in de lijst met categorieën, beweeg de muisaanwijzer over Service Bus en selecteer + vervolgens de knop op de Service Bus-tegel.

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

  4. Voer in de tag Basisinformatie van de pagina Naamruimte maken de volgende stappen uit:

    1. Kies voor Abonnement een Azure-abonnement waarin u de naamruimte maakt.

    2. Kies voor Resourcegroep een bestaande resourcegroep waarin de naamruimte moet worden opgenomen of maak een nieuwe resourcegroep.

    3. Voer een naam in voor de naamruimte. De naamruimtenaam moet voldoen aan de volgende naamconventies:

      • De naam moet uniek zijn in Azure. In het systeem wordt onmiddellijk gecontroleerd of de naam beschikbaar is.
      • De naamlengte is ten minste 6 en maximaal 50 tekens.
      • De naam mag alleen letters, cijfers, afbreekstreepjes "-" bevatten.
      • De naam moet beginnen met een letter en eindigen op een letter of cijfer.
      • De naam eindigt niet op '-sb' of '-mgmt'.
    4. Kies voor Locatie de regio waarin uw naamruimte moet worden gehost.

    5. Selecteer voor de prijscategorie de prijscategorie (Basic, Standard of Premium) voor de naamruimte. Voor deze quickstart selecteert u Standard.

      Belangrijk

      Kies Standard of Premium indien u gebruik wilt maken van onderwerpen en abonnementen. Onderwerpen/abonnementen worden niet ondersteund in de prijscategorie Basic.

      Als u de Prijscategorie Premium hebt geselecteerd, geeft u het aantal berichteneenheden op. De Premium-prijscategorie biedt isolatie van resources op het niveau van de CPU en het geheugen, zodat elke workload geïsoleerd wordt uitgevoerd. Deze resourcecontainer wordt een Messaging-eenheid genoemd. Een Premium-naamruimte heeft ten minste één Messaging-eenheid. U kunt 1, 2, 4, 8 of 16 berichteneenheden selecteren voor elke Service Bus Premium-naamruimte. Zie Service Bus Premium Messaging voor meer informatie.

    6. Selecteer Controleren en maken onderaan de pagina.

      Image showing the Create a namespace page

    7. Controleer de instellingen op de pagina Beoordelen en maken en selecteer Maken.

  5. Zodra de implementatie van de resource is geslaagd, selecteert u Ga naar de resource op de implementatiepagina.

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

  6. U ziet de startpagina voor uw Service Bus-naamruimte.

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

Een onderwerp maken met de Azure-portal

  1. Selecteer in het linkermenu op de pagina Service Bus-naamruimte de optie Onderwerpen.

  2. Selecteer + Onderwerp op de werkbalk.

  3. Voer een naam in voor het onderwerp. Houd voor de overige opties de standaardwaarden aan.

  4. Selecteer Maken.

    Image showing the Create topic page.

Een abonnement op het onderwerp maken

  1. Selecteer het onderwerp dat u in de vorige sectie hebt gemaakt.

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

  2. Selecteer + Abonnement op de werkbalk op de pagina Service Bus-onderwerp.

    Image showing the Add subscription button.

  3. Voer op de pagina Abonnement maken de volgende stappen uit:

    1. Voer S1 in als naam van het abonnement.

    2. Voer 3 in voor maximaal aantal bezorgingen.

    3. Selecteer vervolgens Maken om het abonnement te maken.

      Image showing the Create subscription page.

De app verifiëren bij Azure

In deze quickstart ziet u twee manieren om verbinding te maken met Azure Service Bus: zonder wachtwoord en verbindingsreeks.

De eerste optie laat zien hoe u uw beveiligingsprincipaal gebruikt in Microsoft Entra ID en op rollen gebaseerd toegangsbeheer (RBAC) om verbinding te maken met een Service Bus-naamruimte. U hoeft zich geen zorgen te maken over het in code vastgelegde verbindingsreeks in uw code of in een configuratiebestand of in een beveiligde opslag, zoals Azure Key Vault.

De tweede optie laat zien hoe u een verbindingsreeks gebruikt om verbinding te maken met een Service Bus-naamruimte. Als u nog niet eerder met Azure werkt, kunt u de verbindingsreeks optie gemakkelijker volgen. We raden u aan de optie zonder wachtwoord te gebruiken in echte toepassingen en productieomgevingen. Zie Verificatie en autorisatie voor meer informatie. U kunt ook meer lezen over verificatie zonder wachtwoord op de overzichtspagina.

Rollen toewijzen aan uw Microsoft Entra-gebruiker

Zorg er bij het lokaal ontwikkelen voor dat het gebruikersaccount dat verbinding maakt met Azure Service Bus over de juiste machtigingen beschikt. U hebt de rol Azure Service Bus-gegevenseigenaar nodig om berichten te kunnen verzenden en ontvangen. Als u uzelf deze rol wilt toewijzen, hebt u de rol Gebruikerstoegang Beheer istrator of een andere rol nodig die de Microsoft.Authorization/roleAssignments/write actie bevat. U kunt Azure RBAC-rollen toewijzen aan een gebruiker met behulp van Azure Portal, Azure CLI of Azure PowerShell. Meer informatie over de beschikbare bereiken voor roltoewijzingen op de overzichtspagina van het bereik.

In het volgende voorbeeld wordt de Azure Service Bus Data Owner rol toegewezen aan uw gebruikersaccount, dat volledige toegang biedt tot Azure Service Bus-resources. Volg in een echt scenario het principe van minimale bevoegdheden om gebruikers alleen de minimale machtigingen te geven die nodig zijn voor een veiligere productieomgeving.

Ingebouwde Azure-rollen voor Azure Service Bus

Voor Azure Service Bus is het beheer van naamruimten en alle gerelateerde resources via Azure Portal en de Azure Resource Management-API al beveiligd met behulp van het Azure RBAC-model. Azure biedt de onderstaande ingebouwde Azure-rollen voor het autoriseren van toegang tot een Service Bus-naamruimte:

  • Azure Service Bus-gegevenseigenaar: hiermee schakelt u gegevenstoegang tot de Service Bus-naamruimte en de bijbehorende entiteiten (wachtrijen, onderwerpen, abonnementen en filters) in. Een lid van deze rol kan berichten verzenden en ontvangen van wachtrijen of onderwerpen/abonnementen.
  • Azure Service Bus-gegevenszender: gebruik deze rol om de verzendtoegang tot de Service Bus-naamruimte en de bijbehorende entiteiten te geven.
  • Azure Service Bus-gegevensontvanger: gebruik deze rol om de ontvangsttoegang te geven tot de Service Bus-naamruimte en de bijbehorende entiteiten.

Als u een aangepaste rol wilt maken, raadpleegt u Rechten die vereist zijn voor Service Bus-bewerkingen.

Microsoft Entra-gebruiker toevoegen aan de rol Azure Service Bus-eigenaar

Voeg uw Microsoft Entra-gebruikersnaam toe aan de rol Azure Service Bus-gegevenseigenaar op het niveau van de Service Bus-naamruimte. Hiermee kan een app die wordt uitgevoerd in de context van uw gebruikersaccount berichten verzenden naar een wachtrij of een onderwerp en berichten ontvangen van een wachtrij of het abonnement van een onderwerp.

Belangrijk

In de meeste gevallen duurt het een paar minuten voordat de roltoewijzing is doorgegeven in Azure. In zeldzame gevallen kan het maximaal acht minuten duren. Als u verificatiefouten ontvangt wanneer u de code voor het eerst uitvoert, wacht u even en probeert u het opnieuw.

  1. Als u de pagina Service Bus-naamruimte niet hebt geopend in Azure Portal, zoekt u uw Service Bus-naamruimte met behulp van de hoofdzoekbalk of linkernavigatiebalk.

  2. Selecteer op de overzichtspagina toegangsbeheer (IAM) in het linkermenu.

  3. Selecteer op de pagina Toegangsbeheer (IAM) het tabblad Roltoewijzingen .

  4. Selecteer + Toevoegen in het bovenste menu en voeg vervolgens roltoewijzing toe in de resulterende vervolgkeuzelijst.

    A screenshot showing how to assign a role.

  5. Gebruik het zoekvak om de resultaten te filteren op de gewenste rol. In dit voorbeeld zoekt Azure Service Bus Data Owner en selecteert u het overeenkomende resultaat. Kies vervolgens Volgende.

  6. Selecteer onder Toegang toewijzen de optie Gebruiker, groep of service-principal en kies vervolgens + Leden selecteren.

  7. Zoek in het dialoogvenster naar uw Microsoft Entra-gebruikersnaam (meestal uw user@domain e-mailadres) en kies Vervolgens onderaan het dialoogvenster Selecteren .

  8. Selecteer Beoordelen + toewijzen om naar de laatste pagina te gaan en vervolgens opnieuw beoordelen en toewijzen om het proces te voltooien.

Berichten verzenden naar een onderwerp

In deze sectie maakt u een Java-consoleproject en voegt u code toe om berichten te verzenden naar het onderwerp dat u hebt gemaakt.

Een Java-consoleproject maken

Maak een Java-project met Eclipse of een hulpprogramma van uw keuze.

Uw toepassing configureren voor het gebruik van Service Bus

Voeg verwijzingen toe naar Azure Core- en Azure Service Bus-bibliotheken.

Als u Eclipse gebruikt en een Java-consoletoepassing hebt gemaakt, converteert u uw Java-project naar een Maven: klik met de rechtermuisknop op het project in het venster Package Explorer en selecteer Configure ->Convert to Maven project. Voeg vervolgens afhankelijkheden toe aan deze twee bibliotheken, zoals wordt weergegeven in het volgende voorbeeld.

Werk het pom.xml bestand bij om afhankelijkheden toe te voegen aan Azure Service Bus- en Azure Identity-pakketten.

    <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>

Code toevoegen om berichten naar het onderwerp te verzenden

  1. Voeg de volgende import-instructies toe aan het onderwerp van het Java-bestand.

    import com.azure.messaging.servicebus.*;
    import com.azure.identity.*;
    
    import java.util.concurrent.TimeUnit;
    import java.util.Arrays;
    import java.util.List;
    
  2. Definieer in de klasse variabelen die moeten worden opgeslagen verbindingsreeks (niet nodig voor scenario zonder wachtwoord), onderwerpnaam en abonnementsnaam.

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

    Belangrijk

    Vervang <TOPIC NAME> door de naam van het onderwerp en <SUBSCRIPTION NAME> door de naam van het abonnement van het onderwerp.

  3. Voeg in de klasse een methode toe met de naam sendMessage om een bericht naar het onderwerp te verzenden.

    Belangrijk

    Vervang NAMESPACENAME door de naam van de Service Bus-naamruimte.

    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. Voeg in de klasse een methode toe met de naam createMessages om een lijst met berichten te maken. Normaal gesproken ontvangt u deze berichten van verschillende onderdelen van uw toepassing. Hier maken we een lijst met voorbeeldberichten.

    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. Voeg een methode toe met de naam sendMessageBatch om berichten te verzenden naar het onderwerp dat u hebt gemaakt. Met deze methode maakt u een ServiceBusSenderClient voor het onderwerp, roept u de methode createMessages aan om de lijst met berichten op te halen, bereidt u een of meer batches voor en stuurt u de batch(es) naar het onderwerp.

    Belangrijk

    Vervang NAMESPACENAME door de naam van de Service Bus-naamruimte.

    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();
    }
    

Berichten van een abonnement ontvangen

In deze sectie voegt u code toe om berichten op te halen uit een abonnement op het onderwerp.

  1. Voeg een methode toe met de naam receiveMessages om berichten van het abonnement te ontvangen. Met deze methode maakt u een ServiceBusProcessorClient voor het abonnement door een handler op te geven voor de verwerking van berichten en een andere voor het afhandelen van fouten. Vervolgens wordt de verwerker gestart, wordt er een paar seconden gewacht, worden de ontvangen berichten getoond en wordt de verwerker gestopt en gesloten.

    Belangrijk

    • Vervang NAMESPACENAME door de naam van de Service Bus-naamruimte.
    • Vervang ServiceBusTopicTest in ServiceBusTopicTest::processMessage de code door de naam van uw klas.
    // 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. Voeg de processMessage methode toe om een bericht te verwerken dat is ontvangen van het Service Bus-abonnement.

    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. Voeg de processError methode toe om foutberichten te verwerken.

    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. Werk de methode main bij om de methoden sendMessage, sendMessageBatchen receiveMessages aan te roepen en InterruptedException te genereren.

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

De app uitvoeren

Voer het programma uit om te controleren of the uitvoer lijkt op de volgende uitvoer:

  1. Als u Eclipse gebruikt, klikt u met de rechtermuisknop op het project, selecteert u Exporteren, vouwt u Java uit, selecteert u Runnable JAR-bestand en volgt u de stappen om een uitvoerbaar JAR-bestand te maken.

  2. Als u bent aangemeld bij de computer met een gebruikersaccount dat verschilt van het gebruikersaccount dat is toegevoegd aan de rol Azure Service Bus-gegevenseigenaar , volgt u deze stappen. Sla anders deze stap over en ga verder met het uitvoeren van het Jar-bestand in de volgende stap.

    1. Installeer Azure CLI op uw computer.

    2. Voer de volgende CLI-opdracht uit om u aan te melden bij Azure. Gebruik hetzelfde gebruikersaccount dat u hebt toegevoegd aan de rol Azure Service Bus-gegevenseigenaar .

      az login
      
  3. Voer het Jar-bestand uit met behulp van de volgende opdracht.

    java -jar <JAR FILE NAME>
    
  4. U ziet de volgende uitvoer in het consolevenster.

    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
    

Op de pagina Overzicht voor de Service Bus-naamruimte in Azure Portal ziet u het aantal inkomende en uitgaande berichten. Wacht een minuut of zo en vernieuw de pagina om de meest recente waarden te zien.

Incoming and outgoing message count

Ga naar het tabblad Onderwerpen in het venster midden-onder en selecteer het onderwerp om de pagina Service Bus-onderwerp te bekijken voor uw onderwerp. Op deze pagina ziet u vier inkomende en vier uitgaande berichten in de grafiek Berichten.

Incoming and outgoing messages

Als u de aanroep receiveMessages met een commentaarteken uitschakelt in de methode main en de app opnieuw uitvoert, ziet u op de pagina Service Bus-onderwerp 8 inkomende berichten (4 nieuwe) maar vier uitgaande berichten.

Updated topic page

Als u op deze pagina een abonnement selecteert, krijgt u toegang tot de pagina Service Bus-abonnement. Op deze pagina ziet u het aantal actieve berichten, het aantal onbestelbare berichten, en meer. In dit voorbeeld zijn er vier actieve berichten die de ontvanger nog niet heeft ontvangen.

Active message count

Volgende stappen

Raadpleeg de volgende documentatie en voorbeelden: