Używanie Azure Service Bus z usługą JMS

W tym artykule opisano sposób używania Azure Service Bus z interfejsem API JMS zintegrowanym z platformą Spring JMS.

Podstawowe funkcje

Połączenie bez hasła

Połączenie bez hasła używa Microsoft Entra uwierzytelniania do nawiązywania połączenia z usługami Azure bez przechowywania poświadczeń w aplikacji, jej plikach konfiguracji lub zmiennych środowiskowych. Microsoft Entra uwierzytelnianie to mechanizm łączenia się z Azure Service Bus przy użyciu tożsamości zdefiniowanych w Microsoft Entra ID. Uwierzytelnianie Microsoft Entra umożliwia zarządzanie Service Bus i innymi usługi firmy Microsoft w centralnej lokalizacji, co upraszcza zarządzanie uprawnieniami.

Jak to działa

Spring Cloud Azure najpierw tworzy jeden z następujących typów poświadczeń w zależności od konfiguracji uwierzytelniania aplikacji:

  • ClientSecretCredential
  • ClientCertificateCredential
  • UsernamePasswordCredential
  • ManagedIdentityCredential

Jeśli żaden z tych typów poświadczeń nie zostanie znaleziony, łańcuch poświadczeń za pośrednictwem DefaultTokenCredential jest używany do uzyskiwania poświadczeń z właściwości aplikacji, zmiennych środowiskowych, tożsamości zarządzanej lub środowisk IDE. Aby uzyskać więcej informacji, zobacz Spring Cloud Azure authentication.

Konfiguracja zależności

Dodaj następujące zależności, jeśli chcesz zmigrować aplikację Spring JMS do użycia Azure Service Bus.

<dependency>
    <groupId>com.azure.spring</groupId>
    <artifactId>spring-cloud-azure-starter-servicebus-jms</artifactId>
</dependency>

Konfiguracja

W poniższej tabeli opisano konfigurowalne właściwości w przypadku korzystania z obsługi programu Spring JMS:

Własność Opis
spring.jms.servicebus.connection-string Azure Service Bus parametry połączenia, jeśli chcesz podać parametry połączenia bezpośrednio.
spring.jms.servicebus.topic-client-id Identyfikator klienta JMS. Działa tylko dla fasoli topicJmsListenerContainerFactory.
spring.jms.servicebus.enabled Wartość wskazująca, czy włączyć automatyczną konfigurację Service Bus JMS. Wartość domyślna to true.
spring.jms.servicebus.idle-timeout Limit czasu bezczynności połączenia, który wskazuje, jak długo klient oczekuje, Service Bus zachować połączenie aktywne, gdy nie są dostarczane żadne komunikaty. Wartość domyślna to 2m.
spring.jms.servicebus.passwordless-enabled Czy włączyć bez hasła dla Azure Service Bus JMS. Wartość domyślna to false.
spring.jms.servicebus.pricing-tier Warstwa cenowa Azure Service Bus. Obsługiwane wartości to premium i standard. Warstwa Premium korzysta z usługi Java Message Service (JMS) 2.0, podczas gdy warstwa Standardowa używa programu JMS 1.1 do interakcji z Azure Service Bus.
spring.jms.servicebus.listener.reply-pub-sub-domain Wartość wskazująca, czy typ miejsca docelowego odpowiedzi jest tematem. Działa tylko dla fasoli topicJmsListenerContainerFactory.
spring.jms.servicebus.listener.phase Faza, w której należy uruchomić i zatrzymać ten kontener.
spring.jms.servicebus.listener.reply-qos-settings Konfiguruje QosSettings do użycia podczas wysyłania odpowiedzi.
spring.jms.servicebus.listener.subscription-durable Wartość wskazująca, czy subskrypcja ma być trwała. Działa tylko dla fasoli topicJmsListenerContainerFactory. Wartość domyślna to true.
spring.jms.servicebus.listener.subscription-shared Wartość wskazująca, czy subskrypcja ma być udostępniona. Działa tylko dla fasoli topicJmsListenerContainerFactory.
spring.jms.servicebus.pool.block-if-full Wartość wskazująca, czy zablokować żądanie połączenia, a pula jest pełna. Ustaw wartość false, aby zamiast tego zgłosić JMSException.
spring.jms.servicebus.pool.block-if-full-timeout Okres blokowania przed zgłoszeniem wyjątku, jeśli pula jest nadal pełna.
spring.jms.servicebus.pool.enabled Wartość wskazująca, czy należy utworzyć JmsPoolConnectionFactory zamiast zwykłego ConnectionFactory.
spring.jms.servicebus.pool.idle-timeout Limit czasu bezczynności puli połączeń.
spring.jms.servicebus.pool.max-connections Maksymalna liczba połączeń w puli.
spring.jms.servicebus.pool.max-sessions-per-connection Maksymalna liczba sesji w puli na połączenie w puli.
spring.jms.servicebus.pool.time-between-expiration-check Czas uśpienia między przebiegami wątku eksmisji bezczynności połączenia. Jeśli jest ujemna, wątek eksmisji bezczynności połączenia nie jest uruchamiany.
spring.jms.servicebus.pool.use-anonymous-producers Wartość wskazująca, czy używać tylko jednego wystąpienia anonimowego MessageProducer. Ustaw ją na false, aby utworzyć jedną MessageProducer za każdym razem, gdy jest to wymagane.
spring.jms.servicebus.prefetch-policy.all Wartość rezerwowa opcji pobierania wstępnego w tej Service Bus przestrzeni nazw. Wartość domyślna to 0.
spring.jms.servicebus.prefetch-policy.durable-topic-prefetch Liczba pobierania wstępnego dla trwałego tematu. Wartość domyślna to 0.
spring.jms.servicebus.prefetch-policy.queue-browser-prefetch Liczba pobierania wstępnego dla przeglądarki kolejek. Wartość domyślna to 0.
spring.jms.servicebus.prefetch-policy.queue-prefetch Liczba pobierania wstępnego dla kolejki. Wartość domyślna to 0.
spring.jms.servicebus.prefetch-policy.topic-prefetch Liczba pobierania wstępnego tematu. Wartość domyślna to 0.

Nuta

Ogólna konfiguracja platformy Spring JMS została pominięta na krótko.

Aby uzyskać więcej informacji, zobacz Spring JMS Document.

Podstawowe użycie

Nawiązywanie połączenia z usługą Azure Service Bus JMS przy użyciu bez hasła

Skonfiguruj następujące właściwości w pliku application.yml:

spring:
  jms:
    servicebus:
      namespace: ${AZURE_SERVICEBUS_NAMESPACE}
      pricing-tier: ${PRICING_TIER}
      passwordless-enabled: true

Ważny

program Azure Service Bus JMS obsługuje autoryzację żądań Service Bus zasobów przy użyciu Microsoft Entra ID. W przypadku Microsoft Entra ID upewnij się, że masz przypisaną rolę właściciela danych Azure Service Bus do aktualnie używanego konta Microsoft Entra. Aby uzyskać więcej informacji, zobacz Przypisania ról Azure przy użyciu portalu Azure.

Nawiązywanie połączenia z usługą Azure Service Bus przy użyciu usługi JMS przy użyciu tożsamości zarządzanej

  1. Aby użyć tożsamości zarządzanej, włącz tożsamość zarządzaną usługi i przypisz rolę Azure Service Bus Data Owner. Aby uzyskać więcej informacji, zobacz Authenticate a managed identity with Microsoft Entra ID to access Azure Service Bus resources (

  2. Skonfiguruj następujące właściwości w pliku application.yml:

    spring:
      cloud:
        azure:
          credential:
            managed-identity-enabled: true
      jms:
        servicebus:
          namespace: ${AZURE_SERVICEBUS_NAMESPACE}
          pricing-tier: ${PRICING_TIER}
          passwordless-enabled: true
    

    Ważny

    Jeśli używasz tożsamości zarządzanej przypisanej przez użytkownika, musisz również dodać właściwość spring.cloud.azure.credential.client-id przy użyciu identyfikatora klienta tożsamości zarządzanej przypisanej przez użytkownika.

Nawiązywanie połączenia z usługą Azure Service Bus JMS przy użyciu parametry połączenia

Dodaj następujące właściwości i dobrze jest przejść.

spring:
  jms:
    servicebus:
      connection-string: ${AZURE_SERVICEBUS_CONNECTION_STRING}
      pricing-tier: ${PRICING_TIER}

Nuta

Microsoft zaleca korzystanie z najbezpieczniejszego dostępnego przepływu uwierzytelniania. Przepływ uwierzytelniania opisany w tej procedurze, taki jak bazy danych, pamięci podręczne, komunikaty lub usługi sztucznej inteligencji, wymaga bardzo wysokiego stopnia zaufania w aplikacji i niesie ze sobą ryzyko, które nie występują w innych przepływach. Użyj tego przepływu tylko wtedy, gdy bardziej bezpieczne opcje, takie jak tożsamości zarządzane dla połączeń bez hasła lub bez kluczy, nie są opłacalne. W przypadku operacji maszyny lokalnej preferuj tożsamości użytkowników dla połączeń bez hasła lub bez klucza.

Połączenia

Usługa Spring Cloud Azure udostępnia następujące trzy opcje fabryki połączeń służące do nawiązywania połączenia z usługą Azure Service Bus JMS:

  • JmsPoolConnectionFactory: Ta fabryka obsługuje pulę połączeń z opcjami dostosowywalnymi, takimi jak spring.jms.servicebus.pool.max-connections. Więcej ustawień konfiguracji puli — poprzedzonych prefiksem spring.jms.servicebus.pool. — opisano w sekcji Konfiguracja . Ta konfiguracja zwiększa wydajność przy użyciu funkcji równoważenia obciążenia Azure Service Bus, dystrybuując ruch między wiele punktów końcowych.

  • CachingConnectionFactory: Ta fabryka ponownie używa pojedynczego połączenia dla wszystkich wywołań programu JmsTemplate, co zmniejsza obciążenie związane z tworzeniem połączenia, co jest idealne w scenariuszach o niskim natężeniu ruchu. Jednak ten tryb nie korzysta z możliwości równoważenia obciążenia Azure Service Bus.

  • ServiceBusJmsConnectionFactory: W tym trybie każde wywołanie tworzy JmsTemplate nowe połączenie, które może być intensywnie obciążane zasobami i mniej wydajne.

Kiedy wszystkie trzy klasy istnieją w ścieżce klasy, która z nich jest używana? W poniższej tabeli opisano, które są używane na podstawie właściwości konfiguracji (od platformy Spring Cloud Azure 7.2.0 i 6.2.0):

spring.jms.servicebus.pool.enabled spring.jms.cache.enabled Nadawcy ConnectionFactory Kontener odbiornika ConnectionFactory
nie ustawiono nie ustawiono CachingConnectionFactory ServiceBusJmsConnectionFactory
nie ustawiono true CachingConnectionFactory CachingConnectionFactory
nie ustawiono false ServiceBusJmsConnectionFactory ServiceBusJmsConnectionFactory
true nie ustawiono JmsPoolConnectionFactory JmsPoolConnectionFactory
true true CachingConnectionFactory CachingConnectionFactory
true false JmsPoolConnectionFactory JmsPoolConnectionFactory
false nie ustawiono CachingConnectionFactory ServiceBusJmsConnectionFactory
false true CachingConnectionFactory CachingConnectionFactory
false false ServiceBusJmsConnectionFactory ServiceBusJmsConnectionFactory

Nuta

W poniższej tabeli przedstawiono domyślną ConnectionFactory, gdy obie spring.jms.servicebus.pool.enabled i spring.jms.cache.enabled nie są ustawione dla różnych wersji Azure spring cloud:

Wersja usługi Spring Cloud Azure Nadawcy ConnectionFactory Kontener odbiornika ConnectionFactory
>= 6.2.0 lub >= 7.2.0 CachingConnectionFactory ServiceBusJmsConnectionFactory
6.1.0 i 7.0.0 ServiceBusJmsConnectionFactory ServiceBusJmsConnectionFactory
<= 6.1.0 JmsPoolConnectionFactory JmsPoolConnectionFactory

Próbki

Aby uzyskać więcej informacji, zobacz repozytorium azure-spring-boot-samples w witrynie GitHub.