Skicka meddelanden till ett Azure Service Bus-ämne och ta emot meddelanden från prenumerationer till ämnet (Java)

I den här snabbstarten skriver du Java-kod med hjälp av azure-messaging-servicebus-paketet för att skicka meddelanden till ett Azure Service Bus-ämne och sedan ta emot meddelanden från prenumerationer till det ämnet.

Kommentar

Den här snabbstarten innehåller stegvisa instruktioner för ett enkelt scenario med att skicka en batch meddelanden till ett Service Bus-ämne och ta emot dessa meddelanden från en prenumeration på ämnet. Du hittar fördefinierade Java-exempel för Azure Service Bus i Azure SDK för Java-lagringsplatsen på GitHub.

Dricks

Om du arbetar med Azure Service Bus-resurser i ett Spring-program rekommenderar vi att du ser Spring Cloud Azure som ett alternativ. Spring Cloud Azure är ett projekt med öppen källkod som ger sömlös Spring-integrering med Azure-tjänster. Mer information om Spring Cloud Azure och ett exempel med Service Bus finns i Spring Cloud Stream med Azure Service Bus.

Förutsättningar

Skapa ett namnområde i Azure Portal

För att komma igång med Service Bus-meddelandeentiteter i Azure måste du först skapa ett namnområde med ett namn som är unikt i Azure. Ett namnområde tillhandahåller en omfångscontainer för Service Bus-resurser (köer, ämnen osv.) i ditt program.

Så här skapar du ett namnområde:

  1. Logga in på Azure-portalen.

  2. Gå till sidan Alla tjänster.

  3. I det vänstra navigeringsfältet väljer du Integrering i listan över kategorier, hovra musen över Service Bus och välj + sedan knappen på Service Bus-panelen.

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

  4. Följ dessa steg i taggen Grundläggande på sidan Skapa namnområde:

    1. För Prenumeration väljer du en Azure-prenumeration där du ska skapa namnrymden.

    2. För Resursgrupp väljer du en befintlig resursgrupp där namnrymden ska finnas, eller så skapar du en ny.

    3. Ange ett namn för namnrymden. Namnområdesnamnet bör följa följande namngivningskonventioner:

      • Namnet måste vara unikt i Hela Azure. Systemet kontrollerar omedelbart om namnet är tillgängligt.
      • Namnlängden är minst 6 och högst 50 tecken.
      • Namnet får endast innehålla bokstäver, siffror, bindestreck "-".
      • Namnet måste börja med en bokstav och sluta med en bokstav eller siffra.
      • Namnet slutar inte med "-sb" eller "-mgmt".
    4. För Plats väljer du land eller region där namnrymden ska finnas.

    5. För Prisnivå väljer du prisnivån (Basic, Standard eller Premium) för namnområdet. För den här snabbstarten väljer du Standard.

      Viktigt!

      Om du vill använda ämnen och prenumerationer väljer du antingen Standard eller Premium. Ämnen/prenumerationer stöds inte på prisnivån Basic.

      Om du har valt prisnivån Premium anger du antalet meddelandeenheter. Premium-nivån ger resursisolering på processor- och minnesnivå så att varje arbetsbelastning körs självständigt. Den här resurscontainern kallas för en meddelandefunktionsenhet. Ett premiumnamnområde har minst en meddelandeenhet. Du kan välja 1, 2, 4, 8 eller 16 meddelandeenheter för varje Service Bus Premium-namnområde. Mer information finns i Service Bus Premium-meddelanden.

    6. Välj Granska + skapa längst ned på sidan.

      Image showing the Create a namespace page

    7. På sidan Granska + skapa granskar du inställningarna och väljer Skapa.

  5. När distributionen av resursen har slutförts väljer du Gå till resurs på distributionssidan.

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

  6. Startsidan för din Service Bus-namnrymd visas.

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

Skapa ett ämne med Azure Portal

  1. På sidan Service Bus Namespace (Service Bus-namnrymd) väljer du Ämnen på den vänstra menyn.

  2. Välj + Ämne i verktygsfältet.

  3. Ange ett namn för ämnet. Lämna standardvärdena för de andra alternativen.

  4. Välj Skapa.

    Image showing the Create topic page.

Skapa en prenumeration på ämnet

  1. Välj det ämne som du skapade i föregående avsnitt.

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

  2. På sidan Service Bus-ämne väljer du + Prenumeration i verktygsfältet.

    Image showing the Add subscription button.

  3. Följ dessa steg på sidan Skapa prenumeration :

    1. Ange S1 som namn på prenumerationen.

    2. Ange 3 för Maximalt antal leveranser.

    3. Välj sedan Skapa för att skapa prenumerationen.

      Image showing the Create subscription page.

Autentisera appen till Azure

Den här snabbstarten visar två sätt att ansluta till Azure Service Bus: lösenordsfri och anslutningssträng.

Det första alternativet visar hur du använder ditt säkerhetsobjekt i Microsoft Entra-ID och rollbaserad åtkomstkontroll (RBAC) för att ansluta till ett Service Bus-namnområde. Du behöver inte oroa dig för att ha hårdkodade anslutningssträng i koden eller i en konfigurationsfil eller i ett säkert lagringsutrymme som Azure Key Vault.

Det andra alternativet visar hur du använder en anslutningssträng för att ansluta till ett Service Bus-namnområde. Om du är nybörjare på Azure kan det vara enklare att följa anslutningssträng alternativet. Vi rekommenderar att du använder det lösenordslösa alternativet i verkliga program och produktionsmiljöer. Mer information finns i Autentisering och auktorisering. Du kan också läsa mer om lösenordslös autentisering på översiktssidan.

Tilldela roller till din Microsoft Entra-användare

När du utvecklar lokalt kontrollerar du att användarkontot som ansluter till Azure Service Bus har rätt behörigheter. Du behöver rollen Azure Service Bus-dataägare för att kunna skicka och ta emot meddelanden. Om du vill tilldela dig själv den här rollen behöver du rollen Administratör för användaråtkomst eller en annan roll som innehåller åtgärden Microsoft.Authorization/roleAssignments/write . Du kan tilldela Azure RBAC-roller till en användare med hjälp av Azure-portalen, Azure CLI eller Azure PowerShell. Läs mer om tillgängliga omfång för rolltilldelningar på översiktssidan för omfång .

I följande exempel tilldelas Azure Service Bus Data Owner rollen till ditt användarkonto, vilket ger fullständig åtkomst till Azure Service Bus-resurser. I ett verkligt scenario följer du principen om lägsta behörighet för att ge användarna endast de minsta behörigheter som krävs för en säkrare produktionsmiljö.

Inbyggda Azure-roller för Azure Service Bus

För Azure Service Bus skyddas redan hanteringen av namnområden och alla relaterade resurser via Azure-portalen och Azure-resurshanterings-API:et med hjälp av Azure RBAC-modellen. Azure tillhandahåller de inbyggda Azure-rollerna nedan för att auktorisera åtkomst till ett Service Bus-namnområde:

  • Azure Service Bus-dataägare: Ger dataåtkomst till Service Bus-namnområdet och dess entiteter (köer, ämnen, prenumerationer och filter). En medlem i den här rollen kan skicka och ta emot meddelanden från köer eller ämnen/prenumerationer.
  • Azure Service Bus Data Sender: Använd den här rollen för att ge sändningsåtkomst till Service Bus-namnområdet och dess entiteter.
  • Azure Service Bus-datamottagare: Använd den här rollen för att ge ta emot åtkomst till Service Bus-namnområdet och dess entiteter.

Om du vill skapa en anpassad roll läser du Rättigheter som krävs för Service Bus-åtgärder.

Lägga till Microsoft Entra-användare i rollen Som Azure Service Bus-ägare

Lägg till ditt Microsoft Entra-användarnamn i rollen Azure Service Bus-dataägare på Service Bus-namnområdesnivå. Det gör att en app som körs i kontexten för ditt användarkonto kan skicka meddelanden till en kö eller ett ämne och ta emot meddelanden från en kö eller ett ämnes prenumeration.

Viktigt!

I de flesta fall tar det en minut eller två innan rolltilldelningen sprids i Azure. I sällsynta fall kan det ta upp till åtta minuter. Om du får autentiseringsfel när du först kör koden väntar du en stund och försöker igen.

  1. Om du inte har sidan Service Bus-namnområde öppen i Azure-portalen letar du upp Service Bus-namnområdet med hjälp av huvudsökfältet eller det vänstra navigeringsfältet.

  2. På översiktssidan väljer du Åtkomstkontroll (IAM) på den vänstra menyn.

  3. På sidan Åtkomstkontroll (IAM) väljer du fliken Rolltilldelningar .

  4. Välj + Lägg till på den översta menyn och sedan Lägg till rolltilldelning från den resulterande nedrullningsbara menyn.

    A screenshot showing how to assign a role.

  5. Använd sökrutan för att filtrera resultatet till önskad roll. I det här exemplet söker Azure Service Bus Data Owner du efter och väljer matchande resultat. Välj sedan Nästa.

  6. Under Tilldela åtkomst till väljer du Användare, grupp eller tjänstens huvudnamn och sedan + Välj medlemmar.

  7. I dialogrutan söker du efter ditt Microsoft Entra-användarnamn (vanligtvis din user@domain e-postadress) och väljer sedan Välj längst ned i dialogrutan.

  8. Välj Granska + tilldela för att gå till den sista sidan och sedan Granska + tilldela igen för att slutföra processen.

Skicka meddelanden till ett ämne

I det här avsnittet skapar du ett Java-konsolprojekt och lägger till kod för att skicka meddelanden till det ämne som du skapade.

Skapa ett Java-konsolprojekt

Skapa ett Java-projekt med Eclipse eller ett valfritt verktyg.

Konfigurera ditt program så att det använder Service Bus

Lägg till referenser till Azure Core- och Azure Service Bus-bibliotek.

Om du använder Eclipse och har skapat ett Java-konsolprogram konverterar du Java-projektet till en Maven: högerklicka på projektet i fönstret Paketutforskaren och välj Konfigurera ->Konvertera till Maven-projekt. Lägg sedan till beroenden i dessa två bibliotek enligt följande exempel.

pom.xml Uppdatera filen för att lägga till beroenden i Azure Service Bus- och Azure Identity-paket.

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

Lägga till kod för att skicka meddelanden till ämnet

  1. Lägg till följande import instruktioner i ämnet för Java-filen.

    import com.azure.messaging.servicebus.*;
    import com.azure.identity.*;
    
    import java.util.concurrent.TimeUnit;
    import java.util.Arrays;
    import java.util.List;
    
  2. I klassen definierar du variabler som ska innehålla anslutningssträng (behövs inte för lösenordslöst scenario), ämnesnamn och prenumerationsnamn.

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

    Viktigt!

    Ersätt <TOPIC NAME> med namnet på ämnet och <SUBSCRIPTION NAME> med namnet på ämnets prenumeration.

  3. Lägg till en metod med namnet sendMessage i klassen för att skicka ett meddelande till ämnet.

    Viktigt!

    Ersätt NAMESPACENAME med namnet på Service Bus-namnrymden.

    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. Lägg till en metod med namnet createMessages i klassen för att skapa en lista med meddelanden. Vanligtvis får du dessa meddelanden från olika delar av programmet. Här skapar vi en lista med exempelmeddelanden.

    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. Lägg till en metod med namnet sendMessageBatch metod för att skicka meddelanden till det ämne som du skapade. Den här metoden skapar en ServiceBusSenderClient för ämnet, anropar createMessages metoden för att hämta listan över meddelanden, förbereder en eller flera batchar och skickar batcharna till ämnet.

    Viktigt!

    Ersätt NAMESPACENAME med namnet på Service Bus-namnrymden.

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

Ta emot meddelanden från en prenumeration

I det här avsnittet lägger du till kod för att hämta meddelanden från en prenumeration i ämnet.

  1. Lägg till en metod med namnet receiveMessages för att ta emot meddelanden från prenumerationen. Den här metoden skapar en ServiceBusProcessorClient för prenumerationen genom att ange en hanterare för bearbetning av meddelanden och en annan för hantering av fel. Sedan startar processorn, väntar i några sekunder, skriver ut de meddelanden som tas emot och stoppar och stänger sedan processorn.

    Viktigt!

    • Ersätt NAMESPACENAME med namnet på Service Bus-namnrymden.
    • Ersätt ServiceBusTopicTest i ServiceBusTopicTest::processMessage koden med namnet på din klass.
    // 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. processMessage Lägg till metoden för att bearbeta ett meddelande som tas emot från Service Bus-prenumerationen.

    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. processError Lägg till metoden för att hantera felmeddelanden.

    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. main Uppdatera metoden för att anropa sendMessage, sendMessageBatchoch receiveMessages metoder och för att utlösa InterruptedException.

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

Kör appen

Kör programmet för att se utdata som liknar följande utdata:

  1. Om du använder Eclipse högerklickar du på projektet, väljer Exportera, expanderar Java, väljer Körbar JAR-fil och följer stegen för att skapa en runnable JAR-fil.

  2. Om du är inloggad på datorn med ett användarkonto som skiljer sig från användarkontot som lagts till i rollen Azure Service Bus-dataägare följer du dessa steg. Annars hoppar du över det här steget och går vidare för att köra Jar-filen i nästa steg.

    1. Installera Azure CLI på datorn.

    2. Kör följande CLI-kommando för att logga in på Azure. Använd samma användarkonto som du lade till i rollen Azure Service Bus-dataägare .

      az login
      
  3. Kör Jar-filen med hjälp av följande kommando.

    java -jar <JAR FILE NAME>
    
  4. Du ser följande utdata i konsolfönstret.

    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
    

På sidan Översikt för Service Bus-namnområdet i Azure-portalen kan du se antal inkommande och utgående meddelanden. Vänta i en minut eller så och uppdatera sedan sidan för att se de senaste värdena.

Incoming and outgoing message count

Växla till fliken Ämnen i fönstret längst ned i mitten och välj ämnet för att se sidan Service Bus-ämne för ditt ämne. På den här sidan bör du se fyra inkommande och fyra utgående meddelanden i diagrammet Meddelanden .

Incoming and outgoing messages

Om du kommenterar ut anropet receiveMessagesmain i metoden och kör appen igen visas 8 inkommande meddelanden (4 nya) men fyra utgående meddelanden på sidan Service Bus-ämne .

Updated topic page

Om du väljer en prenumeration på den här sidan kommer du till sidan Service Bus-prenumeration . Du kan se antalet aktiva meddelanden, antal meddelanden med obeställbara meddelanden med mera på den här sidan. I det här exemplet finns det fyra aktiva meddelanden som mottagaren inte har tagit emot ännu.

Active message count

Nästa steg

Se följande dokumentation och exempel: