Verwenden von Azure Service Bus mit JMS

In diesem Artikel wird beschrieben, wie Sie Azure Service Bus mit der JMS-API verwenden, die in das Spring JMS-Framework integriert ist.

Kernfunktionen

Kennwortlose Verbindung

Die kennwortlose Verbindung verwendet Microsoft Entra Authentifizierung zum Herstellen einer Verbindung mit Azure Diensten, ohne Anmeldeinformationen in der Anwendung, der zugehörigen Konfigurationsdateien oder in Umgebungsvariablen zu speichern. Microsoft Entra Authentifizierung ist ein Mechanismus zum Herstellen einer Verbindung mit Azure Service Bus mithilfe von in Microsoft Entra ID definierten Identitäten. Mit Microsoft Entra Authentifizierung können Sie Service Bus und andere Microsoft-Dienste an einem zentralen Ort verwalten, wodurch die Berechtigungsverwaltung vereinfacht wird.

Funktionsweise

Spring Cloud Azure erstellt zunächst einen der folgenden Arten von Anmeldeinformationen, je nach Anwendungsauthentifizierungskonfiguration:

  • ClientSecretCredential
  • ClientCertificateCredential
  • UsernamePasswordCredential
  • ManagedIdentityCredential

Wenn keine dieser Arten von Anmeldeinformationen gefunden wird, wird die Anmeldeinformationskette über DefaultTokenCredential verwendet, um Anmeldeinformationen von Anwendungseigenschaften, Umgebungsvariablen, verwalteter Identität oder IDEs abzurufen. Weitere Informationen finden Sie unter Spring Cloud Azure Authentication.

Setup von Abhängigkeiten

Fügen Sie die folgenden Abhängigkeiten hinzu, wenn Sie Ihre Spring JMS-Anwendung migrieren möchten, um Azure Service Bus zu verwenden.

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

Konfiguration

In der folgenden Tabelle werden die konfigurierbaren Eigenschaften bei Verwendung der Spring JMS-Unterstützung beschrieben:

Eigentum Beschreibung
spring.jms.servicebus.connection-string Die Azure Service Bus Verbindungszeichenfolge, wenn Sie die Verbindungszeichenfolge direkt bereitstellen möchten.
spring.jms.servicebus.topic-client-id Die JMS-Client-ID. Funktioniert nur für die topicJmsListenerContainerFactory Bohnen.
spring.jms.servicebus.enabled Ein Wert, der angibt, ob Service Bus automatische Konfiguration von JMS aktiviert werden soll. Der Standardwert ist true.
spring.jms.servicebus.idle-timeout Die Dauer des Leerlaufs der Verbindung, die angibt, wie lange der Client erwartet, dass Service Bus eine Verbindung aktiv halten, wenn keine Nachrichten übermittelt werden. Der Standardwert ist 2m.
spring.jms.servicebus.passwordless-enabled Gibt an, ob kennwortlos für Azure Service Bus JMS aktiviert werden soll. Der Standardwert ist false.
spring.jms.servicebus.pricing-tier Das Azure Service Bus Preisniveau. Unterstützte Werte sind premium und standard. Die Premium-Stufe verwendet Java Message Service (JMS) 2.0, während die Standardebene JMS 1.1 für die Interaktion mit Azure Service Bus verwendet.
spring.jms.servicebus.listener.reply-pub-sub-domain Ein Wert, der angibt, ob der Antwortzieltyp ein Thema ist. Funktioniert nur für die topicJmsListenerContainerFactory Bohnen.
spring.jms.servicebus.listener.phase Die Phase, in der dieser Container gestartet und beendet werden soll.
spring.jms.servicebus.listener.reply-qos-settings Konfiguriert die beim Senden einer Antwort zu verwendende QosSettings.
spring.jms.servicebus.listener.subscription-durable Ein Wert, der angibt, ob das Abonnement dauerhaft sein soll. Funktioniert nur für die topicJmsListenerContainerFactory Bohnen. Der Standardwert ist true.
spring.jms.servicebus.listener.subscription-shared Ein Wert, der angibt, ob das Abonnement freigegeben werden soll. Funktioniert nur für die topicJmsListenerContainerFactory Bohnen.
spring.jms.servicebus.pool.block-if-full Ein Wert, der angibt, ob blockiert werden soll, wenn eine Verbindung angefordert wird und der Pool voll ist. Legen Sie ihn auf "false" fest, um stattdessen eine JMSException auszuwerfen.
spring.jms.servicebus.pool.block-if-full-timeout Der Sperrzeitraum, bevor eine Ausnahme ausgelöst wird, wenn der Pool noch voll ist.
spring.jms.servicebus.pool.enabled Ein Wert, der angibt, ob eine JmsPoolConnectionFactory erstellt werden soll, anstelle einer regulären ConnectionFactory.
spring.jms.servicebus.pool.idle-timeout Timeout des Verbindungspools im Leerlauf.
spring.jms.servicebus.pool.max-connections Die maximale Anzahl von poolierten Verbindungen.
spring.jms.servicebus.pool.max-sessions-per-connection Die maximale Anzahl von Poolsitzungen pro Verbindung im Pool.
spring.jms.servicebus.pool.time-between-expiration-check Die Zeit für den Ruhezustand zwischen Läufen des Leerlauf-Verbindungs-Eviction-Threads. Wenn negativ, wird kein Leerlaufverbindungsthread ausgeführt.
spring.jms.servicebus.pool.use-anonymous-producers Ein Wert, der angibt, ob nur eine anonyme MessageProducer Instanz verwendet werden soll. Legen Sie sie auf false fest, um jedes Mal eine MessageProducer zu erstellen.
spring.jms.servicebus.prefetch-policy.all Der Fallbackwert für die Prefetch-Option in diesem Service Bus Namespace. Der Standardwert ist 0.
spring.jms.servicebus.prefetch-policy.durable-topic-prefetch Die Anzahl der Vorabstarts für ein dauerhaftes Thema. Der Standardwert ist 0.
spring.jms.servicebus.prefetch-policy.queue-browser-prefetch Die Anzahl der Vorabrufe für den Warteschlangenbrowser. Der Standardwert ist 0.
spring.jms.servicebus.prefetch-policy.queue-prefetch Die Anzahl der Vorabrufe für die Warteschlange. Der Standardwert ist 0.
spring.jms.servicebus.prefetch-policy.topic-prefetch Die Anzahl der Vorabstarts für das Thema. Der Standardwert ist 0.

Anmerkung

Die allgemeine Spring JMS-Konfiguration wird für kurze Zeit weggelassen.

Weitere Informationen finden Sie unter Spring JMS Document.

Grundlegende Nutzung

Herstellen einer Verbindung mit Azure Service Bus JMS ohne Kennwort

Konfigurieren Sie die folgenden Eigenschaften in Ihrer application.yml Datei:

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

Wichtig

Azure Service Bus JMS unterstützt die Verwendung von Microsoft Entra ID, um Anforderungen an Service Bus Ressourcen zu autorisieren. Stellen Sie mit Microsoft Entra ID sicher, dass Sie dem aktuell verwendeten Microsoft Entra Konto die Rolle Azure Service Bus zugewiesen haben. Weitere Informationen finden Sie unter Assign Azure Rollen mithilfe des Azure Portals.

Herstellen einer Verbindung mit Azure Service Bus mit JMS verwenden verwaltete Identität

  1. Um die verwaltete Identität zu verwenden, aktivieren Sie die verwaltete Identität für Ihren Dienst, und weisen Sie die Rolle Azure Service Bus Data Owner zu. Weitere Informationen finden Sie unter Authenticate a managed identity with Microsoft Entra ID to access Azure Service Bus resources.

  2. Konfigurieren Sie die folgenden Eigenschaften in Ihrer application.yml Datei:

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

    Wichtig

    Wenn Sie die vom Benutzer zugewiesene verwaltete Identität verwenden, müssen Sie auch die Eigenschaft spring.cloud.azure.credential.client-id mit Ihrer vom Benutzer zugewiesenen verwalteten Identitätsclient-ID hinzufügen.

Herstellen einer Verbindung mit Azure Service Bus JMS mithilfe von Verbindungszeichenfolge

Fügen Sie die folgenden Eigenschaften hinzu, und Sie können loslegen.

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

Anmerkung

Microsoft empfiehlt die Verwendung des sichersten Authentifizierungsflusses. Der in diesem Verfahren beschriebene Authentifizierungsflow, beispielsweise für Datenbanken, Zwischenspeicher, Nachrichten oder KI-Dienste, erfordert ein sehr hohes Maß an Vertrauen in die Anwendung und birgt Risiken, die bei anderen Flows nicht vorhanden sind. Verwenden Sie diesen Flow nur, wenn sicherere Optionen wie verwaltete Identitäten für kennwortlose oder schlüssellose Verbindungen nicht geeignet sind. Bei Vorgängen des lokalen Computers bevorzugen Sie Benutzeridentitäten für kennwortlose oder schlüssellose Verbindungen.

Verbindungen

Spring Cloud Azure bietet die folgenden drei Verbindungsfactoryoptionen für die Verbindung mit Azure Service Bus JMS:

  • JmsPoolConnectionFactory: Diese Factory verwaltet einen Verbindungspool mit anpassbaren Optionen wie spring.jms.servicebus.pool.max-connections. Weitere Poolkonfigurationseinstellungen – präfixiert spring.jms.servicebus.pool. – finden Sie im Abschnitt "Konfiguration" . Mit diesem Setup wird die Leistung verbessert, indem die Lastenausgleichsfunktion Azure Service Bus verwendet und Datenverkehr über mehrere Endpunkte verteilt wird.

  • CachingConnectionFactory: Diese Factory verwendet eine einzige Verbindung für alle Aufrufe JmsTemplate, wodurch der Aufwand für die Verbindungserstellung reduziert wird, was ideal für Szenarien mit geringem Datenverkehr ist. Dieser Modus verwendet jedoch nicht die Lastenausgleichsfunktion Azure Service Bus.

  • ServiceBusJmsConnectionFactory: In diesem Modus erstellt jeder Aufruf JmsTemplate eine neue Verbindung, die ressourcenintensiv und weniger effizient sein kann.

Wenn alle drei Klassen im Klassenpfad vorhanden sind, welches wird verwendet? In der folgenden Tabelle wird beschrieben, welche basierend auf Konfigurationseigenschaften verwendet wird (seit Spring Cloud Azure 7.2.0 und 6.2.0):

spring.jms.servicebus.pool.enabled spring.jms.cache.enabled Absender ConnectionFactory Listenercontainer ConnectionFactory
nicht festgelegt nicht festgelegt CachingConnectionFactory ServiceBusJmsConnectionFactory
nicht festgelegt true CachingConnectionFactory CachingConnectionFactory
nicht festgelegt false ServiceBusJmsConnectionFactory ServiceBusJmsConnectionFactory
true nicht festgelegt JmsPoolConnectionFactory JmsPoolConnectionFactory
true true CachingConnectionFactory CachingConnectionFactory
true false JmsPoolConnectionFactory JmsPoolConnectionFactory
false nicht festgelegt CachingConnectionFactory ServiceBusJmsConnectionFactory
false true CachingConnectionFactory CachingConnectionFactory
false false ServiceBusJmsConnectionFactory ServiceBusJmsConnectionFactory

Anmerkung

Die folgende Tabelle zeigt die Standard-ConnectionFactory, wenn sowohl spring.jms.servicebus.pool.enabled als auch spring.jms.cache.enabled für unterschiedliche Spring Cloud Azure Versionen nicht festgelegt sind:

Spring Cloud Azure Version Absender ConnectionFactory Listenercontainer ConnectionFactory
>= 6.2.0 oder >= 7.2.0 CachingConnectionFactory ServiceBusJmsConnectionFactory
6.1.0 und 7.0.0 ServiceBusJmsConnectionFactory ServiceBusJmsConnectionFactory
<= 6.1.0 JmsPoolConnectionFactory JmsPoolConnectionFactory

Proben

Weitere Informationen finden Sie im repository azure-spring-boot-samples zu GitHub.