Üzenetek küldése és fogadása az Azure Service Bus-üzenetsorokból (Java)
Ebben a rövid útmutatóban létrehoz egy Java-alkalmazást, amely üzeneteket küld egy Azure Service Bus-üzenetsorba, és üzeneteket fogad.
Feljegyzés
Ez a rövid útmutató lépésről lépésre ismerteti az üzenetek Service Bus-üzenetsorba való küldésének és fogadásának egyszerű forgatókönyvét. 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
- Azure-előfizetés. Az oktatóanyag elvégzéséhez egy Azure-fiókra lesz szüksége. Aktiválhatja MSDN-előfizetői előnyeit, vagy regisztrálhat egy ingyenes fiókot.
- Telepítse az Azure SDK for Java-t. Ha Eclipse-t használ, telepítheti az Azure Toolkit for Eclipse-t , amely tartalmazza a Java-hoz készült Azure SDK-t. Ezután hozzáadhatja a Java-hoz készült Microsoft Azure-kódtárakat a projekthez. Ha IntelliJ-t használ, tekintse meg az Azure Toolkit for IntelliJ telepítését.
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:
Jelentkezzen be az Azure Portalra.
Lépjen a Minden szolgáltatás lapra.
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.
A Névtér létrehozása lap Alapszintű címkéjében kövesse az alábbi lépéseket:
Előfizetés esetén válassza ki azt az Azure-előfizetést, amelyben létre szeretné hozni a névteret.
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.
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ű.
A Hely területen válassza ki azt a régiót, amelyben a névteret üzemeltetni kell.
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.
Válassza a Véleményezés + létrehozás lehetőséget a lap alján.
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.
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.
Megjelenik a service bus-névtér kezdőlapja.
Üzenetsor létrehozása az Azure Portalon
A Service Bus Namespace lapon válassza az Üzenetsorok lehetőséget a bal oldali navigációs menüben.
Az Üzenetsorok lapon válassza az eszköztár + Üzenetsor lehetőséget.
Adja meg az üzenetsor nevét, és hagyja meg a többi értéket az alapértelmezett értékekkel.
Most válassza a Létrehozás lehetőséget.
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-rendszergazdai 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.
Ha nem nyitotta meg a Service Bus Namespace lapot az Azure Portalon, keresse meg a Service Bus-névteret a fő keresősávon vagy a bal oldali navigációs sávon.
Az áttekintési lapon válassza a Hozzáférés-vezérlés (IAM) lehetőséget a bal oldali menüben.
A Hozzáférés-vezérlés (IAM) lapon válassza a Szerepkör-hozzárendelések lapot.
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 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.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.
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.
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 üzenetsorba
Ebben a szakaszban létrehoz egy Java-konzolprojektet, és kódot ad hozzá, amely üzeneteket küld a korábban létrehozott üzenetsorba.
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>
Üzenetsorba küldendő kód hozzáadása
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;
Az osztályban definiáljon változókat a kapcsolati sztring és az üzenetsor nevének tárolásához.
static String queueName = "<QUEUE NAME>";
Fontos
Cserélje le
<QUEUE NAME>
az üzenetsor nevére.Adjon hozzá egy, az osztályban elnevezett
sendMessage
metódust, amely egyetlen üzenetet küld az üzenetsorba.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() .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); }
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); }
Adjon hozzá egy metódus nevű
sendMessageBatch
metódust, amely üzeneteket küld a létrehozott üzenetsorba. Ez a metódus létrehoz egyServiceBusSenderClient
üzenetsort, meghívja acreateMessages
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 az üzenetsornak.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() .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(); }
Üzenetek fogadása üzenetsorból
Ebben a szakaszban kódot ad hozzá az üzenetek üzenetsorból való lekéréséhez.
Adjon hozzá egy metódust, amely az üzenetsorból érkező üzenetek fogadásához van elnevezve
receiveMessages
. Ez a metódus létrehoz egyServiceBusProcessorClient
üzenetsort úgy, hogy egy kezelőt ad meg az üzenetek feldolgozásához, egy másikat pedig a hibák kezeléséhez. 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
QueueTest
QueueTest::processMessage
a kódot az osztály nevére.
// 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(); }
- A(z)
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()); }
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()); } }
Frissítse a metódust a meghíváshoz
sendMessage
éssendMessageBatch
a metódushoz,receiveMessages
valamint a dobáshozInterruptedException
main
.public static void main(String[] args) throws InterruptedException { sendMessage(); sendMessageBatch(); receiveMessages(); }
Az alkalmazás futtatása
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.
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.
Telepítse az Azure CLI-t a gépére.
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
Futtassa a Jar-fájlt a következő paranccsal.
java -jar <JAR FILE NAME>
A következő kimenet jelenik meg a konzolablakban.
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
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.
Válassza ki az üzenetsort ezen az Áttekintés lapon a Service Bus Üzenetsor lapjára való navigáláshoz. Ezen a lapon is látható a bejövő és kimenő üzenetek száma. Egyéb információkat is láthat, például az üzenetsor aktuális méretét , a maximális méretet, az aktív üzenetek számát stb.
Következő lépések
Tekintse meg a következő dokumentációt és mintákat: