Ü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
- Azure-előfizetés. Az oktatóanyag elvégzéséhez egy Azure-fiókra lesz szüksége. Aktiválhatja Visual Studio- vagy MSDN-előfizetői előnyeit , vagy regisztrálhat egy ingyenes fiókra.
- 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.
Üzenettéma létrehozása az Azure Portal használatával
A Service Bus Névtér lapján válassza a bal oldali menü Témakörök elemét.
Válassza a + Témakör lehetőséget az eszköztáron.
Adja meg a témakör nevét. A többi beállítást hagyja az alapértelmezett értékükön.
Válassza a Létrehozás lehetőséget.
Előfizetés létrehozása az üzenettémához
Válassza ki az előző szakaszban létrehozott témakört .
A Service Bus-témakör lapján válassza az eszköztár + Előfizetés lehetőséget.
Az Előfizetés létrehozása lapon kövesse az alábbi lépéseket:
Írja be az S1 nevet az előfizetéshez.
Adja meg a 3 értéket a maximális szállítási számhoz.
Ezután válassza a Létrehozás lehetőséget az előfizetés létrehozásához.
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.
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.
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 ü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
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 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.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); }
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 témakörbe. Ez a metódus létrehoz egyServiceBusSenderClient
témakört, 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 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.
Adjon hozzá egy, az előfizetésből érkező üzenetek fogadásához elnevezett
receiveMessages
metódust. Ez a módszer létrehoz egyServiceBusProcessorClient
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
ServiceBusTopicTest
ServiceBusTopicTest::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(); }
- 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
Futtassa a programot a következő kimenethez hasonló kimenet megtekintéséhez:
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 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.
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.
Ha a metódusban megjegyzést fűz a main
receiveMessages
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.
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.
Következő lépések
Tekintse meg a következő dokumentációt és mintákat:
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: