Wysyłanie komunikatów do kolejek usługi Azure Service Bus i odbieranie ich z kolejek usługi Azure Service Bus (Java)
W tym przewodniku Szybki start utworzysz aplikację Java służącą do wysyłania komunikatów do kolejki usługi Azure Service Bus i odbierania ich z kolejki usługi Azure Service Bus.
Uwaga
Ten przewodnik Szybki start zawiera instrukcje krok po kroku dotyczące prostego scenariusza wysyłania komunikatów do kolejki usługi Service Bus i odbierania ich. Wstępnie utworzone przykłady języka Java dla usługi Azure Service Bus można znaleźć w repozytorium zestawu Azure SDK dla języka Java w witrynie GitHub.
Napiwek
Jeśli pracujesz z zasobami usługi Azure Service Bus w aplikacji Spring, zalecamy rozważenie platformy Azure spring cloud jako alternatywy. Spring Cloud Azure to projekt typu open source, który zapewnia bezproblemową integrację platformy Spring z usługami platformy Azure. Aby dowiedzieć się więcej na temat platformy Spring Cloud Azure i zapoznać się z przykładem korzystania z usługi Service Bus, zobacz Spring Cloud Stream with Azure Service Bus (Usługa Spring Cloud Stream z usługą Azure Service Bus).
Wymagania wstępne
- Subskrypcja platformy Azure. Do wykonania kroków tego samouczka potrzebne jest konto platformy Azure. Możesz aktywować korzyści dla subskrybentów MSDN lub zarejestrować się w celu uzyskania bezpłatnego konta.
- Zainstaluj zestaw Azure SDK dla języka Java. Jeśli używasz środowiska Eclipse, możesz zainstalować zestaw narzędzi Azure Toolkit for Eclipse zawierający zestaw Azure SDK dla języka Java. Następnie możesz dodać biblioteki platformy Microsoft Azure dla języka Java do projektu. Jeśli używasz środowiska IntelliJ, zobacz Instalowanie zestawu narzędzi Azure Toolkit for IntelliJ.
Tworzenie przestrzeni nazw w witrynie Azure Portal
Aby rozpocząć korzystanie z obsługi wiadomości usługi Service Bus na platformie Azure, musisz najpierw utworzyć przestrzeń nazw o nazwie, która jest unikatowa w obrębie platformy Azure. Przestrzeń nazw udostępnia kontener określania zakresu dla zasobów usługi Service Bus (kolejek, tematów itp.) w aplikacji.
Aby utworzyć przestrzeń nazw:
Zaloguj się w witrynie Azure Portal.
Przejdź do strony Wszystkie usługi.
Na lewym pasku nawigacyjnym wybierz pozycję Integracja z listy kategorii, umieść wskaźnik myszy na usłudze Service Bus, a następnie wybierz + przycisk na kafelku usługi Service Bus.
W tagu Podstawowe na stronie Tworzenie przestrzeni nazw wykonaj następujące kroki:
W polu Subskrypcja wybierz subskrypcję platformy Azure, w której ma zostać utworzona przestrzeń nazw.
W obszarze Grupa zasobów wybierz istniejącą grupę zasobów lub utwórz nową.
Wprowadź nazwę przestrzeni nazw. Nazwa przestrzeni nazw powinna być zgodna z następującymi konwencjami nazewnictwa:
- Nazwa musi być unikatowa na platformie Azure. System od razu sprawdza, czy nazwa jest dostępna.
- Długość nazwy wynosi co najmniej 6 i co najwyżej 50 znaków.
- Nazwa może zawierać tylko litery, cyfry, łączniki
-
. - Nazwa musi zaczynać się literą i kończyć literą lub cyfrą.
- Nazwa nie kończy się ciągiem
-sb
lub-mgmt
.
W polu Lokalizacja wybierz region, w którym powinna być hostowana przestrzeń nazw.
W obszarze Warstwa cenowa wybierz warstwę cenową (Podstawowa, Standardowa lub Premium) dla przestrzeni nazw. W tym przewodniku Szybki start wybierz pozycję Standardowa.
Jeśli wybierzesz warstwę Premium , wybierz, czy możesz włączyć replikację geograficzną dla przestrzeni nazw. Funkcja replikacji geograficznej zapewnia, że metadane i dane przestrzeni nazw są stale replikowane z regionu podstawowego do co najmniej jednego regionu pomocniczego.
Ważne
Jeśli chcesz korzystać z tematów i subskrypcji, wybierz warstwę Standardowa lub Premium. Tematy/subskrypcje nie są obsługiwane w warstwie cenowej Podstawowa.
W przypadku wybrania warstwy cenowej Premium określ liczbę jednostek obsługi komunikatów. Warstwa Premium zapewnia izolację zasobów na poziomie procesora i pamięci, dlatego poszczególne obciążenia są od siebie odizolowane. Ten kontener zasobów jest nazywany jednostką obsługi komunikatów. Przestrzeń nazw w warstwie Premium ma co najmniej jedną jednostkę obsługi komunikatów. Możesz wybrać 1, 2, 4, 8 lub 16 jednostek obsługi komunikatów dla każdej przestrzeni nazw usługi Service Bus Premium. Aby uzyskać więcej informacji, zobacz Obsługa komunikatów w usłudze Service Bus w warstwie Premium.
Wybierz pozycję Przejrzyj i utwórz w dolnej części strony.
Na stronie Przeglądanie + tworzenie przejrzyj ustawienia i wybierz pozycję Utwórz.
Po pomyślnym wdrożeniu zasobu wybierz pozycję Przejdź do zasobu na stronie wdrożenia.
Zostanie wyświetlona strona główna dla przestrzeni nazw usługi Service Bus.
Tworzenie kolejki w witrynie Azure Portal
Na stronie Przestrzeń nazw usługi Service Bus rozwiń węzeł Jednostki w menu nawigacyjnym po lewej stronie i wybierz pozycję Kolejki.
Na stronie Kolejki wybierz pozycję + Kolejka na pasku narzędzi.
Wpisz nazwę kolejki, a pozostałe wartości pozostaw domyślne.
Następnie wybierz pozycję Utwórz.
Uwierzytelnianie aplikacji na platformie Azure
W tym przewodniku Szybki start przedstawiono dwa sposoby nawiązywania połączenia z usługą Azure Service Bus: bez hasła i parametry połączenia.
Pierwsza opcja pokazuje, jak używać podmiotu zabezpieczeń w usłudze Microsoft Entra ID i kontroli dostępu opartej na rolach (RBAC) w celu nawiązania połączenia z przestrzenią nazw usługi Service Bus. Nie musisz martwić się o zakodowane parametry połączenia w kodzie lub w pliku konfiguracji lub w bezpiecznym magazynie, na przykład Azure Key Vault.
Druga opcja pokazuje, jak używać parametry połączenia do nawiązywania połączenia z przestrzenią nazw usługi Service Bus. Jeśli dopiero zaczynasz korzystać z platformy Azure, możesz znaleźć opcję parametry połączenia łatwiejszą do naśladowania. Zalecamy użycie opcji bez hasła w rzeczywistych aplikacjach i środowiskach produkcyjnych. Aby uzyskać więcej informacji, zobacz Uwierzytelnianie i autoryzacja. Więcej informacji na temat uwierzytelniania bez hasła można również uzyskać na stronie przeglądu.
Przypisywanie ról do użytkownika firmy Microsoft Entra
Podczas tworzenia aplikacji lokalnie upewnij się, że konto użytkownika, które nawiązuje połączenie z usługą Azure Service Bus, ma odpowiednie uprawnienia. Aby wysyłać i odbierać komunikaty, musisz mieć rolę Właściciela danych usługi Azure Service Bus. Aby przypisać sobie tę rolę, musisz mieć rolę Administratora dostępu użytkowników lub inną rolę obejmującą Microsoft.Authorization/roleAssignments/write
akcję. Role RBAC platformy Azure można przypisać użytkownikowi przy użyciu witryny Azure Portal, interfejsu wiersza polecenia platformy Azure lub programu Azure PowerShell. Dowiedz się więcej o dostępnych zakresach przypisań ról na stronie przeglądu zakresu.
Poniższy przykład przypisuje Azure Service Bus Data Owner
rolę do konta użytkownika, co zapewnia pełny dostęp do zasobów usługi Azure Service Bus. W rzeczywistym scenariuszu postępuj zgodnie z zasadą najniższych uprawnień , aby dać użytkownikom tylko minimalne uprawnienia wymagane do bezpieczniejszego środowiska produkcyjnego.
Wbudowane role platformy Azure dla usługi Azure Service Bus
W przypadku usługi Azure Service Bus zarządzanie przestrzeniami nazw i wszystkimi powiązanymi zasobami za pośrednictwem witryny Azure Portal i interfejsu API zarządzania zasobami platformy Azure jest już chronione przy użyciu modelu RBAC platformy Azure. Platforma Azure udostępnia poniższe wbudowane role platformy Azure umożliwiające autoryzowanie dostępu do przestrzeni nazw usługi Service Bus:
- Właściciel danych usługi Azure Service Bus: umożliwia dostęp danych do przestrzeni nazw usługi Service Bus i jej jednostek (kolejek, tematów, subskrypcji i filtrów). Członek tej roli może wysyłać i odbierać komunikaty z kolejek lub tematów/subskrypcji.
- Nadawca danych usługi Azure Service Bus: użyj tej roli, aby udzielić dostępu do przestrzeni nazw usługi Service Bus i jej jednostek.
- Odbiornik danych usługi Azure Service Bus: ta rola umożliwia uzyskiwanie dostępu do przestrzeni nazw usługi Service Bus i jej jednostek.
Jeśli chcesz utworzyć rolę niestandardową, zobacz Prawa wymagane dla operacji usługi Service Bus.
Dodawanie użytkownika usługi Microsoft Entra do roli właściciela usługi Azure Service Bus
Dodaj nazwę użytkownika usługi Microsoft Entra do roli właściciela danych usługi Azure Service Bus na poziomie przestrzeni nazw usługi Service Bus. Umożliwi to aplikacji działającej w kontekście konta użytkownika wysyłanie komunikatów do kolejki lub tematu oraz odbieranie komunikatów z kolejki lub subskrypcji tematu.
Ważne
W większości przypadków propagacja przypisania roli na platformie Azure potrwa minutę lub dwie. W rzadkich przypadkach może upłynąć do ośmiu minut. Jeśli podczas pierwszego uruchomienia kodu wystąpią błędy uwierzytelniania, zaczekaj chwilę i spróbuj ponownie.
Jeśli nie masz otwartej strony przestrzeni nazw usługi Service Bus w witrynie Azure Portal, znajdź przestrzeń nazw usługi Service Bus przy użyciu głównego paska wyszukiwania lub nawigacji po lewej stronie.
Na stronie przeglądu wybierz pozycję Kontrola dostępu (Zarządzanie dostępem i tożsamościami) z menu po lewej stronie.
Na stronie Kontrola dostępu (Zarządzanie dostępem i tożsamościami) wybierz kartę Przypisania ról.
Wybierz pozycję + Dodaj z górnego menu, a następnie pozycję Dodaj przypisanie roli z wyświetlonego menu rozwijanego.
Użyj pola wyszukiwania, aby filtrować wyniki do żądanej roli. W tym przykładzie wyszukaj
Azure Service Bus Data Owner
i wybierz pasujący wynik. Następnie wybierz pozycję Dalej.W obszarze Przypisz dostęp do wybierz pozycję Użytkownik, grupa lub jednostka usługi, a następnie wybierz pozycję + Wybierz członków.
W oknie dialogowym wyszukaj nazwę użytkownika firmy Microsoft Entra (zazwyczaj adres e-mail user@domain ), a następnie wybierz pozycję Wybierz w dolnej części okna dialogowego.
Wybierz pozycję Przejrzyj i przypisz , aby przejść do ostatniej strony, a następnie ponownie przejrzyj i przypisz, aby ukończyć proces.
Wysyłanie komunikatów do kolejki
W tej sekcji utworzysz projekt konsoli Java i dodasz kod do wysyłania komunikatów do utworzonej wcześniej kolejki.
Tworzenie projektu konsoli Java
Utwórz projekt Java przy użyciu środowiska Eclipse lub wybranego narzędzia.
Konfigurowanie aplikacji do korzystania z usługi Service Bus
Dodaj odwołania do bibliotek Azure Core i Azure Service Bus.
Jeśli używasz środowiska Eclipse i utworzono aplikację konsolową Java, przekonwertuj projekt Java na program Maven: kliknij prawym przyciskiem myszy projekt w oknie Eksplorator pakietów, wybierz polecenie Konfiguruj ->Konwertuj na projekt Maven. Następnie dodaj zależności do tych dwóch bibliotek, jak pokazano w poniższym przykładzie.
Zaktualizuj plik, pom.xml
aby dodać zależności do pakietów usług Azure Service Bus i Azure Identity.
<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>
Dodawanie kodu do wysyłania komunikatów do kolejki
Dodaj następujące
import
instrukcje w temacie pliku Java.import com.azure.messaging.servicebus.*; import com.azure.identity.*; import java.util.concurrent.TimeUnit; import java.util.Arrays; import java.util.List;
W klasie zdefiniuj zmienne do przechowywania parametry połączenia i nazwy kolejki.
static String queueName = "<QUEUE NAME>";
Ważne
Zastąp
<QUEUE NAME>
ciąg nazwą kolejki.Dodaj metodę o nazwie
sendMessage
w klasie, aby wysłać jeden komunikat do kolejki.Ważne
Zastąp ciąg
NAMESPACENAME
nazwą swojej przestrzeni nazw usługi Service Bus.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); }
Dodaj metodę o nazwie
createMessages
w klasie, aby utworzyć listę komunikatów. Zazwyczaj te komunikaty są uzyskiwane z różnych części aplikacji. W tym miejscu utworzymy listę przykładowych komunikatów.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); }
Dodaj metodę o nazwie
sendMessageBatch
, aby wysyłać komunikaty do utworzonej kolejki. Ta metoda tworzyServiceBusSenderClient
obiekt dla kolejki, wywołujecreateMessages
metodę w celu pobrania listy komunikatów, przygotowuje co najmniej jedną partię i wysyła partie do kolejki.Ważne
Zastąp ciąg
NAMESPACENAME
nazwą swojej przestrzeni nazw usługi Service Bus.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(); }
Odbieranie komunikatów z kolejki
W tej sekcji dodasz kod umożliwiający pobranie komunikatów z kolejki.
Dodaj metodę o nazwie
receiveMessages
w celu odbierania komunikatów z kolejki. Ta metoda tworzyServiceBusProcessorClient
obiekt dla kolejki, określając procedurę obsługi do przetwarzania komunikatów, a drugą do obsługi błędów. Następnie uruchamia procesor, czeka na kilka sekund, drukuje odebrane komunikaty, a następnie zatrzymuje i zamyka procesor.Ważne
- Zastąp ciąg
NAMESPACENAME
nazwą swojej przestrzeni nazw usługi Service Bus. - Zastąp
QueueTest
element wQueueTest::processMessage
kodzie nazwą klasy.
// 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(); }
- Zastąp ciąg
Dodaj metodę w celu przetworzenia
processMessage
komunikatu odebranego z subskrypcji usługi Service Bus.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()); }
Dodaj metodę
processError
do obsługi komunikatów o błędach.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()); } }
Zaktualizuj metodę
main
, aby wywołaćsendMessage
metody ,sendMessageBatch
ireceiveMessages
i , aby zgłosić wartośćInterruptedException
.public static void main(String[] args) throws InterruptedException { sendMessage(); sendMessageBatch(); receiveMessages(); }
Uruchom aplikację
Jeśli używasz środowiska Eclipse, kliknij prawym przyciskiem myszy projekt, wybierz pozycję Eksportuj, rozwiń węzeł Java, wybierz pozycję Plik JAR z możliwością uruchamiania i wykonaj kroki tworzenia uruchamialnego pliku JAR.
Jeśli logujesz się do maszyny przy użyciu konta użytkownika innego niż konto użytkownika dodane do roli Właściciel danych usługi Azure Service Bus, wykonaj następujące kroki. W przeciwnym razie pomiń ten krok i przejdź dalej, aby uruchomić plik Jar w następnym kroku.
Zainstaluj interfejs wiersza polecenia platformy Azure na maszynie.
Uruchom następujące polecenie interfejsu wiersza polecenia, aby zalogować się na platformie Azure. Użyj tego samego konta użytkownika, które dodano do roli właściciela danych usługi Azure Service Bus.
az login
Uruchom plik Jar przy użyciu następującego polecenia.
java -jar <JAR FILE NAME>
W oknie konsoli są widoczne następujące dane wyjściowe.
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
Na stronie Przegląd przestrzeni nazw usługi Service Bus w witrynie Azure Portal można zobaczyć liczbę komunikatów przychodzących i wychodzących. Poczekaj minutę, a następnie odśwież stronę, aby wyświetlić najnowsze wartości.
Wybierz kolejkę na tej stronie Przegląd , aby przejść do strony Kolejka usługi Service Bus. Na tej stronie jest też widoczna liczba przychodzących i wychodzących komunikatów . Zobaczysz również inne informacje, takie jak bieżący rozmiar kolejki, maksymalny rozmiar, liczba aktywnych komunikatów itd.
Następne kroki
Zapoznaj się z następującą dokumentacją i przykładami: