Udostępnij za pośrednictwem


Wysyłanie komunikatów do tematu usługi Azure Service Bus i odbieranie komunikatów z subskrypcji do tematu (Java)

W tym szybkim przewodniku startowym napiszesz kod Java, używając pakietu azure-messaging-servicebus, aby wysyłać komunikaty do tematu w usłudze Azure Service Bus, a następnie odbierać komunikaty z subskrypcji tego tematu.

Uwaga

Ten szybki start zawiera instrukcje krok po kroku dotyczące prostego scenariusza wysyłania partii komunikatów do topicu Service Bus i odbierania tych komunikatów z subskrypcji topicu. 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 Spring Cloud Azure 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

Tworzenie przestrzeni nazw w witrynie Azure Portal

Aby rozpocząć korzystanie z jednostek obsługi komunikatów usługi Service Bus na platformie Azure, utwórz przestrzeń nazw o nazwie unikatowej na platformie Azure. Przestrzeń nazw udostępnia kontener określania zakresu dla zasobów usługi Service Bus, takich jak kolejki i tematy, w aplikacji.

Aby utworzyć przestrzeń nazw:

  1. Zaloguj się w witrynie Azure Portal.

  2. Wybierz menu wysuwane w lewym górnym rogu i przejdź do strony Wszystkie usługi.

  3. Na lewym pasku nawigacyjnym wybierz pozycję Integracja.

  4. Przewiń w dół do pozycji Usługi obsługi komunikatów>Service Bus i wybierz pozycję Utwórz.

    Zrzut ekranu przedstawiający wybór opcji Utwórz zasób, integrację, a następnie usługę Service Bus w menu.

  5. Na karcie Podstawowe na stronie Tworzenie przestrzeni nazw wykonaj następujące kroki:

    1. W polu Subskrypcja wybierz subskrypcję platformy Azure, w której ma zostać utworzona przestrzeń nazw.

    2. W obszarze Grupa zasobów wybierz istniejącą grupę zasobów lub utwórz nową.

    3. Wprowadź nazwę przestrzeni nazw , która spełnia następujące konwencje 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.
    4. W obszarze Lokalizacja wybierz region do hostowania przestrzeni nazw.

    5. W obszarze Warstwa cenowa wybierz warstwę cenową (Podstawowa, Standardowa lub Premium) dla przestrzeni nazw. W tym przewodniku Szybki start wybierz pozycję Standardowa.

      W przypadku wybrania warstwy Premium 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 i subskrypcje nie są obsługiwane w warstwie cenowej Podstawowa.

      W przypadku wybrania warstwy cenowej Premium, określ liczbę jednostek wiadomości. 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 Warstwę Premium komunikatów usługi Service Bus.

    6. Wybierz pozycję Przejrzyj i utwórz w dolnej części strony.

      Zrzut ekranu przedstawiający stronę Tworzenie przestrzeni nazw

    7. Na stronie Przeglądanie + tworzenie przejrzyj ustawienia i wybierz pozycję Utwórz.

  6. Po pomyślnym wdrożeniu zasobu wybierz pozycję Przejdź do zasobu na stronie wdrożenia.

    Zrzut ekranu przedstawiający stronę pomyślnego wdrożenia z linkiem Przejdź do zasobu.

  7. Widzisz stronę główną przestrzeni nazw dla swojej usługi Service Bus.

    Zrzut ekranu przedstawiający stronę główną utworzonej przestrzeni nazw usługi Service Bus.

Tworzenie tematu przy użyciu witryny Azure Portal

  1. Na stronie Przestrzeń nazw usługi Service Bus rozwiń sekcję Jednostki w menu nawigacyjnym po lewej stronie, a następnie wybierz Tematy.

  2. Wybierz pozycję + Temat na pasku narzędzi.

  3. Wprowadź nazwę tematu. Pozostaw inne opcje z wartościami domyślnymi.

  4. Wybierz pozycję Utwórz.

    Zrzut ekranu przedstawiający stronę Tworzenie tematu w witrynie Azure Portal.

Tworzenie subskrypcji tematu

  1. Wybierz temat utworzony w poprzedniej sekcji.

    Zrzut ekranu przedstawiający wybór tematu z listy tematów.

  2. Na stronie Temat Service Bus wybierz + Subskrypcja na pasku narzędzi.

    Zrzut ekranu przedstawiający przycisk Dodaj subskrypcję na stronie Temat.

  3. Na stronie Tworzenie subskrypcji wykonaj następujące kroki:

    1. Wprowadź S1 jako nazwę subskrypcji.

    2. Następnie wybierz pozycję Utwórz , aby utworzyć subskrypcję.

      Zrzut ekranu przedstawiający stronę Tworzenie subskrypcji.

Uwierzytelnianie aplikacji na platformie Azure

W tym artykule przedstawiono dwa sposoby nawiązywania połączenia z usługą Azure Service Bus: bez hasła i parametry połączenia.

Pierwsza opcja pokazuje, jak korzystać z podmiotu zabezpieczeń w Microsoft Entra ID oraz z kontroli dostępu opartej na rolach (RBAC), aby połączyć się z przestrzenią nazw Service Bus. Nie musisz martwić się o zakodowane parametry połączenia w kodzie, w pliku konfiguracji ani w bezpiecznym magazynie, na przykład w usłudze 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 usługi Service Bus. Aby dowiedzieć się więcej na temat uwierzytelniania bez hasła, zobacz Uwierzytelnianie aplikacji platformy .NET.

Przypisz role użytkownikowi 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, potrzebna jest rola 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. Aby dowiedzieć się więcej o dostępnych zakresach przypisań ról, zobacz Omówienie zakresu kontroli dostępu opartej na rolach platformy Azure.

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 następujące wbudowane role platformy Azure umożliwiające autoryzowanie dostępu do przestrzeni nazw usługi Service Bus:

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. Ta konfiguracja umożliwia aplikacji uruchamianej w kontekście konta użytkownika wysyłanie komunikatów do kolejki lub tematu. Może przyjmować komunikaty z kolejki lub subskrypcji tematu.

Ważne

W większości przypadków propagacja przypisania roli na platformie Azure zajmuje 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.

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

  2. Na stronie Przegląd wybierz pozycję Kontrola dostępu (Zarządzanie dostępem i tożsamościami) z menu po lewej stronie.

  3. Na stronie Kontrola dostępu (IAM) wybierz kartę Przypisania ról.

  4. Wybierz + Dodaj z górnego menu, a następnie Dodaj przypisanie roli.

    Zrzut ekranu przedstawiający sposób przypisywania roli.

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

  6. W obszarze Przypisz dostęp do wybierz pozycję Użytkownik, grupa lub jednostka usługi, a następnie wybierz pozycję + Wybierz członków.

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

  8. 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 tematu

W tej sekcji utworzysz projekt konsoli Java i dodasz kod do wysyłania komunikatów do utworzonego tematu.

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 tematu

  1. Dodaj następujące import instrukcje na początku pliku Java.

    import com.azure.messaging.servicebus.*;
    import com.azure.identity.*;
    
    import java.util.concurrent.TimeUnit;
    import java.util.Arrays;
    import java.util.List;
    
  2. W klasie zdefiniuj zmienne do przechowywania ciągu połączenia (nie jest to wymagane w scenariuszu bez hasła), nazwy tematu oraz nazwy subskrypcji.

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

    Ważne

    Zastąp <TOPIC NAME> nazwą tematu i <SUBSCRIPTION NAME> subskrypcją tematu.

  3. Dodaj metodę o nazwie sendMessage w klasie, aby wysłać jeden komunikat do tematu.

    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()
                .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. 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);
    }
    
  5. Dodaj metodę o nazwie sendMessageBatch , aby wysyłać komunikaty do utworzonego tematu. Ta metoda tworzy ServiceBusSenderClient dla tematu, wywołuje metodę createMessages w celu uzyskania listy komunikatów, przygotowuje jedną lub więcej partii i wysyła je na temat.

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

Odbieranie komunikatów z subskrypcji

W tej sekcji dodasz kod umożliwiający pobranie komunikatów z subskrypcji do tematu.

  1. Dodaj metodę o nazwie receiveMessages w celu odbierania komunikatów z subskrypcji. Ta metoda tworzy ServiceBusProcessorClient dla subskrypcji, określając procedurę do przetwarzania komunikatów i drugą w celu 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 ServiceBusTopicTest w ServiceBusTopicTest::processMessage w kodzie nazwą swojej klasy.
    // 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. Dodaj metodę processMessage w celu przetworzenia komunikatu odebranego z subskrypcji 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());
    }
    
  3. 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());
        }
    }
    
  4. Zaktualizuj metodę main, aby wywołać metody sendMessage, sendMessageBatch oraz receiveMessages, oraz aby rzucić wyjątek InterruptedException.

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

Uruchom aplikację

Uruchom program, aby wyświetlić dane wyjściowe podobne do następujących danych wyjściowych:

  1. Jeśli używasz środowiska Eclipse, kliknij prawym przyciskiem myszy na projekcie, wybierz pozycję Eksportuj, rozwiń Java, wybierz Uruchamialny plik JAR i wykonaj kroki, aby go stworzyć.

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

    1. Zainstaluj Azure CLI na swoim komputerze.

    2. Uruchom następujące polecenie CLI, aby zalogować się do Azure. Użyj tego samego konta użytkownika, które dodano do roli Azure Service Bus Data Owner.

      az login
      
  3. Uruchom plik Jar przy użyciu następującego polecenia.

    java -jar <JAR FILE NAME>
    
  4. W oknie konsoli są widoczne następujące dane wyjściowe.

    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
    

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.

Liczba komunikatów przychodzących i wychodzących

Przejdź do karty Tematy w dolnej części środkowego okienka i wybierz temat, aby wyświetlić stronę tematu usługi Service Bus dla wybranego tematu. Na tej stronie powinny zostać wyświetlone cztery przychodzące i cztery komunikaty wychodzące na wykresie Komunikaty .

Komunikaty przychodzące i wychodzące

Jeśli skomentujesz wywołanie receiveMessages w metodzie main i ponownie uruchomisz aplikację, na stronie Tematu Service Bus zobaczysz 8 komunikatów przychodzących (4 nowe), ale tylko cztery komunikaty wychodzące.

Zaktualizowana strona tematu

Na tej stronie, po wybraniu subskrypcji, zostaniesz przeniesiony na stronę Subskrypcja usługi Service Bus. Możesz zobaczyć liczbę aktywnych komunikatów, liczbę komunikatów utraconych i więcej na tej stronie. W tym przykładzie istnieją cztery aktywne komunikaty, których odbiorca jeszcze nie odebrał.

Liczba aktywnych komunikatów

Następne kroki

Zapoznaj się z następującą dokumentacją i przykładami: