Üzenetek küldése egy Azure Service Bus-témakörbe, és üzenetek fogadása előfizetésekből a témakörbe (Java)

Ebben a rövid útmutatóban Java-kódot ír az azure-messaging-servicebus csomag használatával, hogy üzeneteket küldjön egy Azure Service Bus-témakörbe, majd fogadjon üzeneteket az előfizetésekből a témakörbe.

Feljegyzés

Ez a rövid útmutató részletes útmutatást nyújt egy egyszerű forgatókönyvhöz, amely során üzeneteket küldünk egy Service Bus-témakörbe, és fogadjuk ezeket az üzeneteket a témakör egy előfizetéséből. Az Azure Service Bus előre elkészített Java-mintáit a GitHub Azure SDK for Java-adattárában találja.

Tipp.

Ha Azure Service Bus-erőforrásokkal dolgozik egy Spring-alkalmazásban, javasoljuk, hogy fontolja meg a Spring Cloud Azure-t alternatívaként. A Spring Cloud Azure egy nyílt forráskódú projekt, amely zökkenőmentes Spring-integrációt biztosít az Azure-szolgáltatásokkal. Ha többet szeretne megtudni a Spring Cloud Azure-ról, és egy Példát szeretne látni a Service Bus használatával, tekintse meg a Spring Cloud Streamet az Azure Service Bus használatával.

Előfeltételek

Névtér létrehozása az Azure Portalon

A Service Bus-üzenetküldési entitások Azure-ban való használatának megkezdéséhez először létre kell hoznia egy, az Azure-ban egyedi névvel rendelkező névteret. A névtér egy hatókör-tárolót biztosít a Service Bus-erőforrásokhoz (üzenetsorokhoz, témakörökhöz stb.) az alkalmazásban.

Névtér létrehozása:

  1. Jelentkezzen be az Azure Portalra.

  2. Lépjen a Minden szolgáltatás lapra.

  3. A bal oldali navigációs sávon válassza az Integráció lehetőséget a kategóriák listájából, vigye az egérmutatót a Service Bus fölé, majd válassza a + Service Bus csempén található gombot.

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

  4. A Névtér létrehozása lap Alapszintű címkéjében kövesse az alábbi lépéseket:

    1. Előfizetés esetén válassza ki azt az Azure-előfizetést, amelyben létre szeretné hozni a névteret.

    2. Erőforráscsoport esetén válasszon ki egy meglévő erőforráscsoportot, amelyben a névtér él, vagy hozzon létre egy újat.

    3. Adja meg a névtér nevét. A névtér nevének meg kell felelnie a következő elnevezési konvencióknak:

      • A névnek egyedinek kell lennie az Azure-ban. A rendszer azonnal ellenőrzi, hogy a név elérhető-e.
      • A név hossza legalább 6 és legfeljebb 50 karakter lehet.
      • A név csak betűket, számokat, "-" kötőjeleket tartalmazhat.
      • A névnek betűvel kell kezdődnie, és betűvel vagy számmal kell végződnie.
      • A név nem "-sb" vagy "-mgmt" végződésű.
    4. A Hely területen válassza ki azt a régiót, amelyben a névteret üzemeltetni kell.

    5. Tarifacsomag esetén válassza ki a névtérhez tartozó tarifacsomagot (Alapszintű, Standard vagy Prémium). Ebben a rövid útmutatóban válassza a Standard lehetőséget.

      Fontos

      Ha témaköröket és előfizetéseket szeretne használni, válassza a Standard vagy a Premium lehetőséget. Az alapszintű tarifacsomag nem támogatja a témaköröket/előfizetéseket.

      Ha a Prémium tarifacsomagot választotta, adja meg az üzenetkezelési egységek számát. A prémium szint erőforrás-elkülönítést biztosít a CPU és a memória szintjén, így minden számítási feladat külön fut. Ennek az erőforrás-tárolónak a neve üzenetkezelési egység. A prémium szintű névtér legalább egy üzenetkezelési egységgel rendelkezik. Minden Service Bus Premium-névtérhez választhat 1, 2, 4, 8 vagy 16 üzenetkezelési egységet. További információ: Service Bus Premium Messaging.

    6. Válassza a Véleményezés + létrehozás lehetőséget a lap alján.

      Image showing the Create a namespace page

    7. A Véleményezés + létrehozás lapon tekintse át a beállításokat, és válassza a Létrehozás lehetőséget.

  5. Miután az erőforrás üzembe helyezése sikeres volt, válassza az Erőforrás megnyitása lehetőséget az üzembe helyezési lapon.

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

  6. Megjelenik a service bus-névtér kezdőlapja.

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

Üzenettéma létrehozása az Azure Portal használatával

  1. A Service Bus Névtér lapján válassza a bal oldali menü Témakörök elemét.

  2. Válassza a + Témakör lehetőséget az eszköztáron.

  3. Adja meg a témakör nevét. A többi beállítást hagyja az alapértelmezett értékükön.

  4. Válassza a Létrehozás lehetőséget.

    Image showing the Create topic page.

Előfizetés létrehozása az üzenettémához

  1. Válassza ki az előző szakaszban létrehozott témakört .

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

  2. A Service Bus-témakör lapján válassza az eszköztár + Előfizetés lehetőséget.

    Image showing the Add subscription button.

  3. Az Előfizetés létrehozása lapon kövesse az alábbi lépéseket:

    1. Írja be az S1 nevet az előfizetéshez.

    2. Adja meg a 3 értéket a maximális szállítási számhoz.

    3. Ezután válassza a Létrehozás lehetőséget az előfizetés létrehozásához.

      Image showing the Create subscription page.

Az alkalmazás hitelesítése az Azure-ban

Ez a rövid útmutató az Azure Service Bushoz való csatlakozás két módját mutatja be: jelszó nélküli és kapcsolati sztring.

Az első lehetőség bemutatja, hogyan használhatja a biztonsági tagot a Microsoft Entra-azonosítóban és a szerepköralapú hozzáférés-vezérlésben (RBAC) a Service Bus-névtérhez való csatlakozáshoz. Nem kell aggódnia amiatt, hogy a kódban, a konfigurációs fájlban vagy egy biztonságos tárolóban, például az Azure Key Vaultban keményen kódolt kapcsolati sztring kell lennie.

A második lehetőség bemutatja, hogyan csatlakozhat egy Service Bus-névtérhez egy kapcsolati sztring. Ha még nem ismerkedik az Azure-sal, könnyebben követheti a kapcsolati sztring lehetőséget. A jelszó nélküli beállítást a valós alkalmazásokban és éles környezetekben javasoljuk. További információ: Hitelesítés és engedélyezés. A jelszó nélküli hitelesítésről az áttekintési oldalon olvashat bővebben.

Szerepkörök hozzárendelése a Microsoft Entra-felhasználóhoz

Helyi fejlesztéskor győződjön meg arról, hogy az Azure Service Bushoz csatlakozó felhasználói fiók rendelkezik a megfelelő engedélyekkel. Az üzenetek küldéséhez és fogadásához szüksége lesz az Azure Service Bus adattulajdonosi szerepkörére. A szerepkör hozzárendeléséhez szüksége lesz a Felhasználói hozzáférés Rendszergazda istrator szerepkörre, vagy egy másik szerepkörre, amely tartalmazza a Microsoft.Authorization/roleAssignments/write műveletet. Azure RBAC-szerepköröket rendelhet egy felhasználóhoz az Azure Portal, az Azure CLI vagy az Azure PowerShell használatával. További információ a szerepkör-hozzárendelések elérhető hatóköreiről a hatókör áttekintési oldalán.

Az alábbi példa hozzárendeli a szerepkört a Azure Service Bus Data Owner felhasználói fiókjához, amely teljes hozzáférést biztosít az Azure Service Bus-erőforrásokhoz. Egy valós forgatókönyvben kövesse a Minimális jogosultság elvét, hogy a felhasználók csak a biztonságosabb éles környezethez szükséges minimális engedélyeket adják meg a felhasználóknak.

Azure beépített szerepkörök az Azure Service Bushoz

Az Azure Service Bus esetében a névterek és az összes kapcsolódó erőforrás kezelése az Azure Portalon és az Azure Resource Management API-val már védett az Azure RBAC-modell használatával. Az Azure az alábbi beépített Azure-szerepköröket biztosítja a Service Bus-névtérhez való hozzáférés engedélyezéséhez:

  • Azure Service Bus-adattulajdonos: Lehetővé teszi a Service Bus-névtérhez és annak entitásaihoz (üzenetsorokhoz, témakörökhöz, előfizetésekhez és szűrőkhöz) való adathozzáférést. A szerepkör egy tagja üzeneteket küldhet és fogadhat üzenetsorokból vagy témakörökből/előfizetésekből.
  • Azure Service Bus-adatküldő: Ezzel a szerepkörrel hozzáférést adhat a Service Bus-névtérhez és annak entitásaihoz.
  • Azure Service Bus-adatfogadó: Ezzel a szerepkörrel hozzáférést adhat a Service Bus-névtérhez és annak entitásaihoz.

Ha egyéni szerepkört szeretne létrehozni, tekintse meg a Service Bus-műveletekhez szükséges jogosultságokat.

Microsoft Entra-felhasználó hozzáadása az Azure Service Bus tulajdonosi szerepköréhez

Adja hozzá a Microsoft Entra-felhasználónevet az Azure Service Bus-adattulajdonosi szerepkörhöz a Service Bus névtér szintjén. Lehetővé teszi, hogy a felhasználói fiók környezetében futó alkalmazások üzeneteket küldjenek egy üzenetsorba vagy egy témakörbe, és üzeneteket fogadhassanak egy üzenetsorból vagy egy témakör előfizetéséből.

Fontos

A legtöbb esetben egy-két percig tart, amíg a szerepkör-hozzárendelés propagálása az Azure-ban megtörténik. Ritkán akár nyolc percig is eltarthat. Ha hitelesítési hibákat kap a kód első futtatásakor, várjon néhány percet, és próbálkozzon újra.

  1. Ha nem nyitotta meg a Service Bus Névtér lapját az Azure Portalon, keresse meg a Service Bus-névteret a fő keresősávon vagy a bal oldali navigációs sávon.

  2. Az áttekintési lapon válassza a Hozzáférés-vezérlés (IAM) lehetőséget a bal oldali menüben.

  3. A Hozzáférés-vezérlés (IAM) lapon válassza a Szerepkör-hozzárendelések lapot.

  4. Válassza a +Hozzáadás lehetőséget a felső menüből, majd a szerepkör-hozzárendelés hozzáadása lehetőséget az eredményül kapott legördülő menüből.

    A screenshot showing how to assign a role.

  5. A keresőmezővel szűrheti az eredményeket a kívánt szerepkörre. Ebben a példában keresse meg Azure Service Bus Data Owner és válassza ki az egyező eredményt. Ezután válassza a Tovább gombot.

  6. A Hozzáférés hozzárendelése területen válassza a Felhasználó, csoport vagy szolgáltatásnév lehetőséget, majd válassza a + Tagok kijelölése lehetőséget.

  7. A párbeszédpanelen keresse meg a Microsoft Entra-felhasználónevet (általában a user@domain e-mail-címét), majd válassza a Párbeszédpanel alján található Kiválasztás lehetőséget.

  8. Válassza a Véleményezés + hozzárendelés lehetőséget a végső lapra való ugráshoz, majd a folyamat befejezéséhez a Véleményezés + hozzárendelés lehetőséget.

Üzenetek küldése egy üzenettémakörbe

Ebben a szakaszban létrehoz egy Java-konzolprojektet, és kódot ad hozzá, amely üzeneteket küld a létrehozott témakörbe.

Java-konzolprojekt létrehozása

Hozzon létre egy Java-projektet az Eclipse vagy egy tetszőleges eszköz használatával.

Az alkalmazás konfigurálása a Service Bus használatára

Azure Core- és Azure Service Bus-kódtárakra mutató hivatkozások hozzáadása.

Ha Eclipse-t használ, és java-konzolalkalmazást hozott létre, konvertálja a Java-projektet Mavensé: kattintson a jobb gombbal a projektre a Csomagkezelő ablakban, és válassza a Konfigurálás –>Átalakítás Maven-projektté. Ezután adjon hozzá függőségeket ehhez a két kódtárhoz az alábbi példában látható módon.

Frissítse a fájlt, pom.xml hogy függőségeket adjon hozzá az Azure Service Bushoz és az Azure Identity-csomagokhoz.

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

Üzenetküldési kód hozzáadása a témakörhöz

  1. Adja hozzá a következő import utasításokat a Java-fájl témaköréhez.

    import com.azure.messaging.servicebus.*;
    import com.azure.identity.*;
    
    import java.util.concurrent.TimeUnit;
    import java.util.Arrays;
    import java.util.List;
    
  2. Az osztályban definiáljon változókat a kapcsolati sztring tárolásához (jelszó nélküli forgatókönyvhöz nem szükséges), a témakör nevét és az előfizetés nevét.

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

    Fontos

    Cserélje le <TOPIC NAME> a témakör nevére és <SUBSCRIPTION NAME> a témakör előfizetésének nevére.

  3. Adjon hozzá egy, az osztályban elnevezett sendMessage metódust, amely egyetlen üzenetet küld a témakörnek.

    Fontos

    A(z) NAMESPACENAME helyére írja be a Service Bus-névtér nevét.

    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. Adjon hozzá egy, az osztályban elnevezett createMessages metódust az üzenetek listájának létrehozásához. Ezek az üzenetek általában az alkalmazás különböző részeiből származnak. Itt létrehozzuk a mintaüzenetek listáját.

    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. Adjon hozzá egy metódus nevű sendMessageBatch metódust, amely üzeneteket küld a létrehozott témakörbe. Ez a metódus létrehoz egy ServiceBusSenderClient témakört, meghívja a createMessages metódust az üzenetek listájának lekéréséhez, előkészít egy vagy több köteget, és elküldi a kötegeket a témakörnek.

    Fontos

    A(z) NAMESPACENAME helyére írja be a Service Bus-névtér nevét.

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

Üzenetek fogadása előfizetésből

Ebben a szakaszban kódot ad hozzá, amely lekéri az üzeneteket egy előfizetésből a témakörbe.

  1. Adjon hozzá egy, az előfizetésből érkező üzenetek fogadásához elnevezett receiveMessages metódust. Ez a módszer létrehoz egy ServiceBusProcessorClient előfizetést egy üzenetfeldolgozási kezelő, egy másik pedig a hibák kezelésére szolgáló kezelő megadásával. Ezután elindítja a processzort, néhány másodpercig várakozik, kinyomtatja a fogadott üzeneteket, majd leállítja és bezárja a processzort.

    Fontos

    • A(z) NAMESPACENAME helyére írja be a Service Bus-névtér nevét.
    • Írja be ServiceBusTopicTestServiceBusTopicTest::processMessage a kódot az osztály nevére.
    // 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. Adja hozzá a processMessage Service Bus-előfizetéstől kapott üzenet feldolgozásának módját.

    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. Adja hozzá a processError hibaüzenetek kezelésére szolgáló módszert.

    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. Frissítse a metódust a meghíváshoz sendMessageés sendMessageBatcha metódushoz, receiveMessages valamint a dobáshozInterruptedExceptionmain.

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

Az alkalmazás futtatása

Futtassa a programot a következő kimenethez hasonló kimenet megtekintéséhez:

  1. Ha Eclipse-t használ, kattintson a jobb gombbal a projektre, válassza az Exportálás lehetőséget, bontsa ki a Java-t, válassza a Futtatható JAR-fájl lehetőséget, és kövesse a lépéseket egy futtatható JAR-fájl létrehozásához.

  2. Ha olyan felhasználói fiókkal jelentkezett be a gépre, amely eltér az Azure Service Bus-adattulajdonosi szerepkörhöz hozzáadott felhasználói fióktól, kövesse az alábbi lépéseket. Ellenkező esetben hagyja ki ezt a lépést, és folytassa a Jar-fájl futtatásával a következő lépésben.

    1. Telepítse az Azure CLI-t a gépére.

    2. Futtassa a következő CLI-parancsot az Azure-ba való bejelentkezéshez. Használja ugyanazt a felhasználói fiókot, amelyet az Azure Service Bus adattulajdonosi szerepköréhez adott hozzá.

      az login
      
  3. Futtassa a Jar-fájlt a következő paranccsal.

    java -jar <JAR FILE NAME>
    
  4. A következő kimenet jelenik meg a konzolablakban.

    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
    

Az Azure Portal Service Bus-névterének Áttekintés lapján láthatja a bejövő és kimenő üzenetek számát. Várjon egy percet, majd frissítse a lapot a legújabb értékek megtekintéséhez.

Incoming and outgoing message count

Váltson a középső alsó panel Témakörök lapjára, és válassza ki a témakört a témakör Service Bus-témakör lapjának megtekintéséhez. Ezen a lapon négy bejövő és négy kimenő üzenetnek kell megjelennie az Üzenetek diagramon.

Incoming and outgoing messages

Ha a metódusban megjegyzést fűz a mainreceiveMessages híváshoz, és ismét futtatja az alkalmazást, a Service Bus-témakör lapján 8 bejövő üzenet (4 új), de négy kimenő üzenet jelenik meg.

Updated topic page

Ezen a lapon, ha kiválaszt egy előfizetést, megjelenik a Service Bus-előfizetés lap. Ezen a lapon láthatja az aktív üzenetek számát, a kézbesíthetetlen üzenetek számát és egyebeket. Ebben a példában négy aktív üzenet van, amelyeket a fogadó még nem fogadott.

Active message count

Következő lépések

Tekintse meg a következő dokumentációt és mintákat: