Azure Service Bus konusuna ileti gönderme ve aboneliklerden konu başlığına ileti alma (Java)

Bu hızlı başlangıçta, Azure Service Bus konusuna ileti göndermek için azure-messaging-servicebus paketini kullanarak Java kodu yazacak ve ardından aboneliklerden bu konuya ileti alacaksınız.

Not

Bu hızlı başlangıç, Service Bus konusuna toplu ileti gönderme ve bu iletileri konunun bir aboneliğinden alma gibi basit bir senaryo için adım adım yönergeler sağlar. Azure Service Bus için önceden oluşturulmuş Java örneklerini GitHub'daki Java için Azure SDK deposunda bulabilirsiniz.

İpucu

Spring uygulamasında Azure Service Bus kaynaklarıyla çalışıyorsanız Spring Cloud Azure'ı alternatif olarak değerlendirmenizi öneririz. Spring Cloud Azure, Azure hizmetleriyle sorunsuz Spring tümleştirmesi sağlayan açık kaynak bir projedir. Spring Cloud Azure hakkında daha fazla bilgi edinmek ve Service Bus kullanarak bir örnek görmek için bkz . Azure Service Bus ile Spring Cloud Stream.

Önkoşullar

  • Azure aboneliği. Bu öğreticiyi tamamlamak için bir Azure hesabınızın olması gerekir. Visual Studio veya MSDN abone avantajlarınızı etkinleştirebilir veya ücretsiz bir hesaba kaydolabilirsiniz.
  • Java için Azure SDK'sını yükleyin. Eclipse kullanıyorsanız, Java için Azure SDK'yı içeren Eclipse için Azure Toolkit'i yükleyebilirsiniz. Daha sonra projenize Java için Microsoft Azure Kitaplıkları'nı ekleyebilirsiniz. IntelliJ kullanıyorsanız bkz . IntelliJ için Azure Toolkit'i yükleme.

Azure portalında bir ad alanı oluşturma

Azure'da Service Bus mesajlaşma varlıklarını kullanmaya başlamak için öncelikle Azure'da benzersiz olan bir ad alanı oluşturmanız gerekir. Ad alanı, uygulamanızdaki Service Bus kaynakları (kuyruklar, konular vb.) için bir kapsam kapsayıcısı sağlar.

Ad alanı oluşturmak için:

  1. Azure Portal’ında oturum açın.

  2. Tüm hizmetler sayfasına gidin.

  3. Sol gezinti çubuğunda, kategoriler listesinden Tümleştirme'yi seçin, fareyi Service Bus'ın üzerine getirin ve ardından Service Bus kutucuğundaki düğmeyi seçin+.

    Image showing selection of Create a resource, Integration, and then Service Bus in the menu.

  4. Ad alanı oluştur sayfasının Temel bilgiler etiketinde şu adımları izleyin:

    1. Abonelik için ad alanının oluşturulacağı bir Azure aboneliği seçin.

    2. Kaynak grubu için, ad alanının yaşayacağı mevcut bir kaynak grubunu seçin veya yeni bir tane oluşturun.

    3. Ad alanı için bir ad girin. Ad alanı adı aşağıdaki adlandırma kurallarına uymalıdır:

      • Adın Azure genelinde benzersiz olması gerekir. Adın kullanılabilirliği sistem tarafından hemen denetlenir.
      • Ad uzunluğu en az 6 ve en fazla 50 karakterdir.
      • Ad yalnızca harf, sayı, kısa çizgi "-" içerebilir.
      • Ad bir harfle başlamalı ve bir harf veya numarayla bitmelidir.
      • Ad "-sb" veya "-mgmt" ile bitmiyor.
    4. Konum için ad alanınızın barındırılacağı bölgeyi seçin.

    5. Fiyatlandırma katmanı için ad alanı için fiyatlandırma katmanını (Temel, Standart veya Premium) seçin. Bu hızlı başlangıç için Standart'ı seçin.

      Önemli

      Konuları ve abonelikleri kullanmak istiyorsanız Standart veya Premium'u seçin. Konular/abonelikler Temel fiyatlandırma katmanında desteklenmez.

      Premium fiyatlandırma katmanını seçtiyseniz, mesajlaşma birimi sayısını belirtin. Premium katman, her iş yükünün yalıtılmış olarak çalışması için CPU ve bellek düzeyinde kaynak yalıtımı sağlar. Bu kaynak kapsayıcısı mesajlaşma birimi olarak adlandırılır. Premium ad alanında en az bir mesajlaşma birimi vardır. Her Service Bus Premium ad alanı için 1, 2, 4, 8 veya 16 mesajlaşma birimleri seçebilirsiniz. Daha fazla bilgi için bkz . Service Bus Premium Mesajlaşma.

    6. Sayfanın alt kısmındaki Gözden geçir ve oluştur'u seçin.

      Image showing the Create a namespace page

    7. Gözden geçir ve oluştur sayfasında ayarları gözden geçirin ve Oluştur'u seçin.

  5. Kaynağın dağıtımı başarılı olduktan sonra dağıtım sayfasında Kaynağa git'i seçin.

    Image showing the deployment succeeded page with the Go to resource link.

  6. Service Bus ad alanınızın giriş sayfasını görürsünüz.

    Image showing the home page of the Service Bus namespace created.

Azure portalını kullanarak konu oluşturma

  1. Service Bus Ad Alanı sayfasında, soldaki menüden Konular'ı seçin.

  2. Araç çubuğunda + Konu'ya tıklayın.

  3. Konu için bir ad girin. Diğer seçenekleri varsayılan değerlerinde bırakın.

  4. Oluştur'u belirleyin.

    Image showing the Create topic page.

Konuya abonelik oluşturma

  1. Önceki bölümde oluşturduğunuz konuyu seçin.

    Image showing the selection of topic from the list of topics.

  2. Service Bus Konusu sayfasında araç çubuğunda + Abonelik'i seçin.

    Image showing the Add subscription button.

  3. Abonelik oluştur sayfasında şu adımları izleyin:

    1. Aboneliğin adı olarak S1 girin.

    2. En fazla teslimat sayısı için 3 girin.

    3. Ardından, aboneliği oluşturmak için Oluştur'u seçin.

      Image showing the Create subscription page.

Azure'da uygulamanın kimliğini doğrulama

Bu hızlı başlangıçta Azure Service Bus'a bağlanmanın iki yolu gösterilir: parolasız ve bağlantı dizesi.

İlk seçenek, Service Bus ad alanına bağlanmak için Microsoft Entra Id ve rol tabanlı erişim denetiminde (RBAC) güvenlik sorumlunuzu nasıl kullanacağınızı gösterir. Kodunuzda, yapılandırma dosyasında veya Azure Key Vault gibi güvenli bir depolama alanında sabit kodlanmış bağlantı dizesi olması konusunda endişelenmeniz gerekmez.

İkinci seçenek, Service Bus ad alanına bağlanmak için bir bağlantı dizesi nasıl kullanacağınızı gösterir. Azure'da yeniyseniz bağlantı dizesi seçeneğini daha kolay takip edebilirsiniz. Gerçek dünyadaki uygulamalarda ve üretim ortamlarında parolasız seçeneği kullanmanızı öneririz. Daha fazla bilgi için bkz . Kimlik doğrulaması ve yetkilendirme. Ayrıca, genel bakış sayfasında parolasız kimlik doğrulaması hakkında daha fazla bilgi edinebilirsiniz.

Microsoft Entra kullanıcınıza rol atama

Yerel olarak geliştirme yaparken, Azure Service Bus'a bağlanan kullanıcı hesabının doğru izinlere sahip olduğundan emin olun. İleti gönderip almak için Azure Service Bus Veri Sahibi rolüne sahip olmanız gerekir. Kendinize bu rolü atamak için Kullanıcı Erişimi Yönetici istrator rolüne veya eylemi içeren Microsoft.Authorization/roleAssignments/write başka bir role ihtiyacınız olacaktır. Azure portalı, Azure CLI veya Azure PowerShell'i kullanarak kullanıcıya Azure RBAC rolleri atayabilirsiniz. Kapsam genel bakış sayfasında rol atamaları için kullanılabilir kapsamlar hakkında daha fazla bilgi edinin.

Aşağıdaki örnekte rol, Azure Service Bus kaynaklarına tam erişim sağlayan kullanıcı hesabınıza atanır Azure Service Bus Data Owner . Gerçek bir senaryoda, kullanıcılara yalnızca daha güvenli bir üretim ortamı için gereken minimum izinleri vermek için En Az Ayrıcalık İlkesi'ni izleyin.

Azure Service Bus için Azure yerleşik rolleri

Azure Service Bus için, Azure portalı ve Azure kaynak yönetimi API'sini kullanarak ad alanlarının ve tüm ilgili kaynakların yönetimi Azure RBAC modeli kullanılarak zaten korunur. Azure, Service Bus ad alanına erişim yetkisi vermek için aşağıdaki Azure yerleşik rollerini sağlar:

  • Azure Service Bus Veri Sahibi: Service Bus ad alanına ve varlıklarına (kuyruklar, konular, abonelikler ve filtreler) veri erişimini etkinleştirir. Bu rolün bir üyesi kuyruklardan veya konu başlıklarından/aboneliklerden ileti gönderip alabilir.
  • Azure Service Bus Veri Göndereni: Service Bus ad alanına ve varlıklarına gönderme erişimi vermek için bu rolü kullanın.
  • Azure Service Bus Veri Alıcısı: Service Bus ad alanına ve varlıklarına alma erişimi vermek için bu rolü kullanın.

Özel bir rol oluşturmak istiyorsanız bkz . Service Bus işlemleri için gereken haklar.

Microsoft Entra kullanıcısını Azure Service Bus Sahibi rolüne ekleme

Microsoft Entra kullanıcı adınızı Service Bus ad alanı düzeyinde Azure Service Bus Veri Sahibi rolüne ekleyin. Kullanıcı hesabınız bağlamında çalışan bir uygulamanın kuyruğa veya konuya ileti göndermesine ve kuyruktan veya konunun aboneliğinden ileti almasına olanak tanır.

Önemli

Çoğu durumda rol atamasının Azure'a yayılması bir veya iki dakika sürer. Nadir durumlarda, sekiz dakikaya kadar sürebilir. Kodunuzu ilk kez çalıştırdığınızda kimlik doğrulama hataları alıyorsanız, birkaç dakika bekleyin ve yeniden deneyin.

  1. Azure portalında Service Bus Ad Alanı sayfanız açık değilse ana arama çubuğunu veya sol gezintiyi kullanarak Service Bus ad alanınızı bulun.

  2. Genel bakış sayfasında, sol taraftaki menüden Erişim denetimi (IAM) öğesini seçin.

  3. Erişim denetimi (IAM) sayfasında Rol atamaları sekmesini seçin.

  4. Üst menüden + Ekle'yi seçin ve ardından açılan menüden Rol ataması ekle'yi seçin.

    A screenshot showing how to assign a role.

  5. Sonuçları istenen role göre filtrelemek için arama kutusunu kullanın. Bu örnek için eşleşen sonucu arayın Azure Service Bus Data Owner ve seçin. Ardından İleri'yi seçin.

  6. Erişim ata'nın altında Kullanıcı, grup veya hizmet sorumlusu'na tıklayın ve ardından + Üye seç'e tıklayın.

  7. İletişim kutusunda Microsoft Entra kullanıcı adınızı (genellikle user@domain e-posta adresiniz) arayın ve iletişim kutusunun alt kısmındaki Seç'i seçin.

  8. Son sayfaya gitmek için Gözden geçir + ata'yı seçin ve ardından işlemi tamamlamak için Gözden geçir + yeniden ata'yı seçin.

Konu başlığına ileti gönderme

Bu bölümde bir Java konsol projesi oluşturacak ve oluşturduğunuz konuya ileti göndermek için kod ekleymelisiniz.

Java konsol projesi oluşturma

Eclipse'i veya seçtiğiniz bir aracı kullanarak bir Java projesi oluşturun.

Uygulamanızı Service Bus kullanacak şekilde yapılandırma

Azure Core ve Azure Service Bus kitaplıklarına başvurular ekleyin.

Eclipse kullanıyor ve bir Java konsol uygulaması oluşturduysanız Java projenizi Maven'a dönüştürün: Paket Gezgini penceresinde projeye sağ tıklayın, Yapılandır ->Maven projesine dönüştür'ü seçin. Ardından, aşağıdaki örnekte gösterildiği gibi bu iki kitaplıkta bağımlılıkları ekleyin.

pom.xml Azure Service Bus ve Azure Identity paketlerine bağımlılık eklemek için dosyayı güncelleştirin.

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

Konuya ileti göndermek için kod ekleme

  1. Java dosyasının konusuna aşağıdaki import deyimleri ekleyin.

    import com.azure.messaging.servicebus.*;
    import com.azure.identity.*;
    
    import java.util.concurrent.TimeUnit;
    import java.util.Arrays;
    import java.util.List;
    
  2. sınıfında, bağlantı dizesi (parolasız senaryo için gerekli değildir), konu adını ve abonelik adını tutacak değişkenleri tanımlayın.

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

    Önemli

    öğesini konunun adıyla ve <SUBSCRIPTION NAME> konu başlığının aboneliğinin adıyla değiştirin<TOPIC NAME>.

  3. Konuya bir ileti göndermek için sınıfında adlı sendMessage bir yöntem ekleyin.

    Önemli

    NAMESPACENAME yerine Service Bus ad alanınızın adını yazdığınızdan emin olun.

    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. İleti listesi oluşturmak için sınıfına adlı createMessages bir yöntem ekleyin. Genellikle bu iletileri uygulamanızın farklı bölümlerinden alırsınız. Burada örnek iletilerin listesini oluşturacağız.

    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. Oluşturduğunuz konuya ileti göndermek için method adlı sendMessageBatch bir yöntem ekleyin. Bu yöntem konu için bir ServiceBusSenderClient oluşturur, ileti listesini almak için yöntemini çağırır createMessages , bir veya daha fazla toplu iş hazırlar ve toplu işleri konuya gönderir.

    Önemli

    NAMESPACENAME yerine Service Bus ad alanınızın adını yazdığınızdan emin olun.

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

Abonelikten ileti alma

Bu bölümde, bir abonelikten konu başlığına ileti almak için kod ekleyebilirsiniz.

  1. Abonelikten ileti almak için adlı receiveMessages bir yöntem ekleyin. Bu yöntem, iletileri işlemek için bir işleyici ve hataları işlemek için başka bir işleyici belirterek abonelik için bir ServiceBusProcessorClient oluşturur. Ardından işlemciyi başlatır, birkaç saniye bekler, alınan iletileri yazdırır ve ardından işlemciyi durdurup kapatır.

    Önemli

    • NAMESPACENAME yerine Service Bus ad alanınızın adını yazdığınızdan emin olun.
    • kodunda öğesini ServiceBusTopicTest::processMessage sınıfınızın adıyla değiştirinServiceBusTopicTest.
    // 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. processMessage Service Bus aboneliğinden alınan bir iletiyi işlemek için yöntemini ekleyin.

    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. processError Hata iletilerini işlemek için yöntemini ekleyin.

    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. main, ve sendMessageBatchyöntemlerini çağırmak sendMessageve receiveMessages atmak InterruptedExceptioniçin yöntemini güncelleştirin.

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

Uygulamayı çalıştırma

Aşağıdaki çıkışa benzer bir çıktı görmek için programı çalıştırın:

  1. Eclipse kullanıyorsanız projeye sağ tıklayın, Dışarı Aktar'ı seçin, Java'yı genişletin, Çalıştırılabilir JAR dosyası'nı seçin ve çalıştırılabilir jar dosyası oluşturmak için adımları izleyin.

  2. Makinede Azure Service Bus Veri Sahibi rolüne eklenen kullanıcı hesabından farklı bir kullanıcı hesabı kullanarak oturum açtıysanız şu adımları izleyin. Aksi takdirde, bu adımı atlayın ve sonraki adımda Jar dosyasını çalıştırmak için devam edin.

    1. Makinenize Azure CLI yükleyin.

    2. Azure'da oturum açmak için aşağıdaki CLI komutunu çalıştırın. Azure Service Bus Veri Sahibi rolüne eklediğiniz kullanıcı hesabını kullanın.

      az login
      
  3. Aşağıdaki komutu kullanarak Jar dosyasını çalıştırın.

    java -jar <JAR FILE NAME>
    
  4. Konsol penceresinde aşağıdaki çıkışı görürsünüz.

    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
    

Azure portalındaki Service Bus ad alanının Genel Bakış sayfasında, gelen ve giden ileti sayısını görebilirsiniz. Bir dakika kadar bekleyin ve en son değerleri görmek için sayfayı yenileyin.

Incoming and outgoing message count

Orta alt bölmedeki Konular sekmesine geçin ve konunuzun Service Bus Konusu sayfasını görmek için konuyu seçin. Bu sayfada, İletiler grafiğinde dört gelen ve dört giden ileti görmeniz gerekir.

Incoming and outgoing messages

Yöntemindeki çağrıyı receiveMessages açıklama satırı yaparsanız ve uygulamayı yeniden çalıştırırsanız, Service Bus Konusu sayfasında 8 gelen ileti (4 yeni) ancak dört giden ileti main görürsünüz.

Updated topic page

Bu sayfada, bir abonelik seçerseniz Service Bus Aboneliği sayfasına ulaşabilirsiniz. Bu sayfada etkin ileti sayısını, teslim edilemeyen ileti sayısını ve daha fazlasını görebilirsiniz. Bu örnekte, alıcının henüz almadığı dört etkin ileti vardır.

Active message count

Sonraki adımlar

Aşağıdaki belgelere ve örneklere bakın: