JMS ile Azure Service Bus kullanma

Bu makalede, Spring JMS çerçevesiyle tümleştirilmiş JMS API'siyle Azure Service Bus nasıl kullanılacağı açıklanmaktadır.

Temel özellikler

Parolasız bağlantı

Parolasız bağlantı, uygulamada, yapılandırma dosyalarında veya ortam değişkenlerinde hiçbir kimlik bilgisi depolamadan Azure hizmetlere bağlanmak için Microsoft Entra kimlik doğrulamasını kullanır. Microsoft Entra kimlik doğrulaması, Microsoft Entra ID tanımlanan kimlikleri kullanarak Azure Service Bus bağlanma mekanizmasıdır. Microsoft Entra kimlik doğrulaması ile Service Bus ve diğer Microsoft hizmetleri merkezi bir konumda yönetebilirsiniz ve bu da izin yönetimini basitleştirir.

Nasıl çalışır?

Spring Cloud Azure, uygulama kimlik doğrulaması yapılandırmasına bağlı olarak ilk olarak aşağıdaki kimlik bilgileri türlerinden birini oluşturur:

  • ClientSecretCredential
  • ClientCertificateCredential
  • UsernamePasswordCredential
  • ManagedIdentityCredential

Bu tür kimlik bilgilerinin hiçbiri bulunmazsa, DefaultTokenCredential aracılığıyla kimlik bilgisi zinciri uygulama özelliklerinden, ortam değişkenlerinden, yönetilen kimlikten veya IDE'lerden kimlik bilgilerini almak için kullanılır. Daha fazla bilgi için bkz. Spring Cloud Azure authentication.

Bağımlılık kurulumu

Spring JMS uygulamanızı Azure Service Bus kullanacak şekilde geçirmek istiyorsanız aşağıdaki bağımlılıkları ekleyin.

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

Konfigürasyon

Aşağıdaki tabloda Spring JMS desteği kullanılırken yapılandırılabilir özellikler açıklanmaktadır:

Mülk Açıklama
spring.jms.servicebus.connection-string Bağlantı dizesini doğrudan sağlamak istediğiniz durumlarda kullanılacak Azure Service Bus bağlantı dizesi.
spring.jms.servicebus.topic-client-id JMS istemci kimliği. Sadece topicJmsListenerContainerFactory fasulye için çalışır.
spring.jms.servicebus.enabled Service Bus JMS otomatik yapılandırmasının etkinleştirilip etkinleştirilmeydiğini gösteren değer. Varsayılan değer true.
spring.jms.servicebus.idle-timeout İstemcinin, hiç ileti teslim edilmediğinde Service Bus'ın bir bağlantıyı ne kadar süre canlı tutmasını beklediğini gösteren bağlantının boşta kalma zaman aşımı süresi. Varsayılan değer 2m.
spring.jms.servicebus.passwordless-enabled Azure Service Bus JMS için parolasız etkinleştirilip etkinleştirilmeyileceği. Varsayılan değer false.
spring.jms.servicebus.pricing-tier Azure Service Bus Fiyatlandırma Katmanı. Desteklenen değerler premium ve standard. Premium katman Java İleti Hizmeti (JMS) 2.0'ı kullanırken standart katmanda Azure Service Bus ile etkileşime geçmek için JMS 1.1 kullanılır.
spring.jms.servicebus.listener.reply-pub-sub-domain Yanıt hedef türünün bir konu başlığı olup olmadığını gösteren değer. Sadece topicJmsListenerContainerFactory fasulye için çalışır.
spring.jms.servicebus.listener.phase Bu kapsayıcının başlatılıp durdurulacağı aşama.
spring.jms.servicebus.listener.reply-qos-settings Yanıt gönderirken kullanılacak QosSettings yapılandırılır.
spring.jms.servicebus.listener.subscription-durable Aboneliğin dayanıklı olup olmayacağını gösteren bir değer. Sadece topicJmsListenerContainerFactory fasulye için çalışır. Varsayılan değer true.
spring.jms.servicebus.listener.subscription-shared Aboneliğin paylaşılıp paylaşılmayacağını gösteren değer. Sadece topicJmsListenerContainerFactory fasulye için çalışır.
spring.jms.servicebus.pool.block-if-full Bir bağlantı istendiğinde ve havuz dolu olduğunda engellenip engellenmeyeceğini gösteren değer. Bunun yerine bir JMSException fırlatmak için bunu false olarak ayarlayın.
spring.jms.servicebus.pool.block-if-full-timeout Havuz hâlâ doluysa özel durum fırlatılmadan önceki bekleme süresi.
spring.jms.servicebus.pool.enabled Normal JmsPoolConnectionFactoryyerine bir ConnectionFactory oluşturulup oluşturulmayacağını gösteren değer.
spring.jms.servicebus.pool.idle-timeout Bağlantı havuzunun boşta kalma zaman aşımı.
spring.jms.servicebus.pool.max-connections Havuzdaki bağlantıların en fazla sayısı.
spring.jms.servicebus.pool.max-sessions-per-connection Havuzdaki her bağlantı için havuza alınan en fazla oturum sayısı.
spring.jms.servicebus.pool.time-between-expiration-check Boşta bağlantıları tahliye eden iş parçacığının çalışmaları arasındaki bekleme süresi. Negatif olduğunda, boştaki bağlantıları çıkarma iş parçacığı çalıştırılmaz.
spring.jms.servicebus.pool.use-anonymous-producers Yalnızca bir anonim MessageProducer örneğinin kullanılıp kullanılmayacağını gösteren bir değer. Gerektiğinde bir MessageProducer oluşturmak için bunu false olarak ayarlayın.
spring.jms.servicebus.prefetch-policy.all Bu Service Bus ad alanındaki prefetch seçeneğinin yedek değeri. Varsayılan değer 0.
spring.jms.servicebus.prefetch-policy.durable-topic-prefetch Kalıcı konu için önceden getirme sayısı. Varsayılan değer 0.
spring.jms.servicebus.prefetch-policy.queue-browser-prefetch Kuyruk tarayıcısı için önceden getirme sayısı. Varsayılan değer 0.
spring.jms.servicebus.prefetch-policy.queue-prefetch Kuyruk için önceden getirme sayısı. Varsayılan değer 0.
spring.jms.servicebus.prefetch-policy.topic-prefetch Konu için önceden getirme sayısı. Varsayılan değer 0.

Not

Spring JMS genel yapılandırması kısaca atlanır.

Daha fazla bilgi için bkz. Spring JMS Belgesi.

Temel kullanım

Parolasız kullanarak Azure Service Bus JMS'ye bağlanma

application.yml dosyanızda aşağıdaki özellikleri yapılandırın:

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

Önemli

Azure Service Bus JMS, Service Bus kaynaklarına yönelik istekleri yetkilendirmek için Microsoft Entra ID kullanmayı destekler. Microsoft Entra ID ile, kullanmakta olduğunuz Microsoft Entra hesabına Azure Service Bus Veri Sahibi rolünü atadığınızdan emin olun. Daha fazla bilgi için bkz. Azure portalını kullanarak Azure rolleri atama.

Yönetilen Kimlik kullanarak JMS ile Azure Service Bus’a bağlanma

  1. Yönetilen kimliği kullanmak için hizmetiniz için yönetilen kimliği etkinleştirin ve Azure Service Bus Data Owner rolünü atayın. Daha fazla bilgi için bkz. Azure Service Bus kaynaklarına erişmek için Microsoft Entra ID ile yönetilen kimlik doğrulama.

  2. application.yml dosyanızda aşağıdaki özellikleri yapılandırın:

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

    Önemli

    Kullanıcı tarafından atanan yönetilen kimlik kullanıyorsanız, kullanıcı tarafından atanan yönetilen kimlik istemci kimliğiniz ile spring.cloud.azure.credential.client-id özelliğini de eklemeniz gerekir.

bağlantı dizesi kullanarak Azure Service Bus JMS'ye bağlanma

Aşağıdaki özellikleri eklediğinizde hazır olursunuz.

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

Not

Microsoft, kullanılabilir en güvenli kimlik doğrulama akışının kullanılmasını önerir. Veritabanları, önbellekler, mesajlaşma veya yapay zeka hizmetleri gibi bu yordamda açıklanan kimlik doğrulama akışı, uygulamaya çok yüksek düzeyde güven gerektirir ve diğer akışlarda mevcut olmayan riskler taşır. Bu akışı yalnızca parolasız veya anahtarsız bağlantılar için yönetilen kimlikler gibi daha güvenli seçenekler uygun olmadığında kullanın. Yerel makine işlemleri için parolasız veya anahtarsız bağlantılar için kullanıcı kimliklerini tercih edin.

Bağlantı

Spring Cloud Azure, Azure Service Bus JMS'ye bağlanmak için aşağıdaki üç Connection Factory seçeneğini sağlar:

  • JmsPoolConnectionFactory: Bu fabrika, gibi spring.jms.servicebus.pool.max-connectionsözelleştirilebilir seçeneklere sahip bir bağlantı havuzu tutar. Ön ekli spring.jms.servicebus.pool. diğer havuz yapılandırma ayarları Yapılandırma bölümünde ayrıntılı olarak yer alır. Bu kurulum, Azure Service Bus yük dengeleme özelliğini kullanarak performansı artırır ve trafiği birden çok uç noktaya dağıtır.

  • CachingConnectionFactory: Bu fabrika, tüm JmsTemplate çağrıları için tek bir bağlantıyı yeniden kullanır; bu da bağlantı oluşturma ek yükünü azaltır ve düşük trafikli senaryolar için idealdir. Ancak bu mod Azure Service Bus yük dengeleme özelliğini kullanmaz.

  • ServiceBusJmsConnectionFactory: Bu modda, JmsTemplate için yapılan her çağrı yeni bir bağlantı oluşturur; bu da fazla kaynak tüketebilir ve daha az verimli olabilir.

Sınıf yolu içinde üç sınıfın tümü mevcut olduğunda hangisi kullanılır? Aşağıdaki tabloda, yapılandırma özelliklerine (Spring Cloud Azure 7.1.0 ve 6.2.0'dan bu yana) göre hangilerin kullanıldığı açıklanmaktadır:

spring.jms.servicebus.pool.enabled spring.jms.cache.enabled Gönderici ConnectionFactory Dinleyici Kapsayıcısı ConnectionFactory
ayarlanmadı ayarlanmadı CachingConnectionFactory ServiceBusJmsConnectionFactory
ayarlanmadı true CachingConnectionFactory CachingConnectionFactory
ayarlanmadı false ServiceBusJmsConnectionFactory ServiceBusJmsConnectionFactory
true ayarlanmadı JmsPoolConnectionFactory JmsPoolConnectionFactory
true true CachingConnectionFactory CachingConnectionFactory
true false JmsPoolConnectionFactory JmsPoolConnectionFactory
false ayarlanmadı CachingConnectionFactory ServiceBusJmsConnectionFactory
false true CachingConnectionFactory CachingConnectionFactory
false false ServiceBusJmsConnectionFactory ServiceBusJmsConnectionFactory

Not

Aşağıdaki tabloda, hem ConnectionFactory hem de spring.jms.servicebus.pool.enabled farklı Spring Cloud Azure sürümleri için ayarlanmamışsa varsayılan spring.jms.cache.enabled gösterilmektedir:

Spring Cloud Azure sürümü Gönderen ConnectionFactory Dinleyici kapsayıcısı ConnectionFactory
>= 6.2.0 veya >= 7.1.0 CachingConnectionFactory ServiceBusJmsConnectionFactory
6.1.0 ve 7.0.0 ServiceBusJmsConnectionFactory ServiceBusJmsConnectionFactory
<= 6.1.0 JmsPoolConnectionFactory JmsPoolConnectionFactory

Örnekler

Daha fazla bilgi için GitHub'daki azure-spring-boot-samples deposuna bakın.