Konu başlığı kullanarak ileti göndermek ve almak için kod yazma

Tamamlandı

Dağıtılmış bir ortamda bazı iletilerin tek bir alıcı bileşen gönderilmesi gerekir. Diğer iletilerin ise birden fazla hedefe ulaşması gerekir.

Bir kullanıcı bisiklet siparişini iptal ettiğinde ne olacağını düşünün. Siparişi iptal etmek, ilk siparişi vermekten biraz farklıdır. Bir sipariş verildiğinde, iş akışı siparişi yerel vitrine göndermeden önce siparişin ödeme işleminin temizlenmesini bekledi. İptal işlemi için aynı anda vitrini ve ödeme işlemcisini bilgilendirirsiniz. Bu yaklaşım, teslimat sürücüsü zamanını boşa harcama olasılığını en aza indirir.

Birden çok bileşenin aynı iletiyi almasına izin vermek için bir Azure Service Bus konusu kullanacaksınız. Ardından, işleme ve kodu yazarken dikkate alınacak noktalara göz atacaksınız.

Konu başlıklarıyla kod - kuyruklarla kod

Her iletinin tüm abone olan bileşenlere teslim edilmesi için gönderilmesini istiyorsanız konuları kullanın. Kuyrukların yerini alacak şekilde konuların kullanıldığı kodlardan faydalanılabilir. Aynı Azure.Messaging.ServiceBus NuGet paketini kullanacak, bağlantı dizesi yapılandıracak ve zaman uyumsuz programlama desenlerini kullanacaksınız.

İleti göndermek için aynı ServiceBusClient sınıfı ve ServiceBusSender sınıfları, iletileri almak için de ServiceBusProcessor sınıfını kullanacaksınız.

Aboneliklerde filtre ayarlama

Konuya gönderilen belirli iletilerin belirli bir aboneliğe teslim edilmesi istiyorsanız, konu başlığındaki aboneliğe bir veya daha fazla filtre yerleştirebilirsiniz. Örneğin bisiklet uygulamasında vitrinleriniz Evrensel Windows Platformu (UWP) uygulamaları çalıştırıyor. Her mağaza konuya abone OrderCancellation olabilir ve kendi StoreIdiçin filtreleyebilir. Birden çok mağaza konumuna gereksiz iletiler göndermediğiniz için İnternet bant genişliğini kaydedersiniz. Bu arada, ödeme işleme bileşeni tüm OrderCancellation iletilere abone olur.

Üç farklı filtre türü vardır:

  • Boole filtreleri: konusuna TrueFilter gönderilen tüm iletilerin geçerli aboneliğe teslim edilmesini sağlar. FalseFilter, hiçbir iletinin geçerli aboneliğe teslim edilmemesini sağlar. (Bu etkili bir şekilde aboneliği engeller veya devre dışı bırakır.)
  • SQL filtreleri: SQL filtresi, BIR SQL sorgusundaki yan tümceyle WHERE aynı söz dizimini kullanarak bir koşul belirtir. Yalnızca bu filtreye göre değerlendirildiğinde döndürülen True iletiler abonelere teslim edilir.
  • Bağıntı filtreleri: Bağıntı filtresi, her iletinin özellikleriyle eşleşen bir dizi koşul barındırıyor. Filtredeki özellik ve iletideki özellik aynı değere sahipse, eşleşme olarak kabul edilir.

Filtreniz StoreId için bir SQL filtresi kullanabilirsiniz. SQL filtreleri en esnek filtrelerdir, ancak aynı zamanda hesaplama açısından en pahalı filtrelerdir ve filtre Service Bus aktarım hızınızı yavaşlatabilir. Bu durumda, bir bağıntı filtresi seçersiniz.

Bir konuya ileti göndermek için

Bir konuya ileti göndermek için aşağıdaki adımları tamamlayacaksınız.

Herhangi bir gönderen veya alan bileşende, Service Bus konusunu çağıran herhangi bir kod dosyasına aşağıdaki using deyimleri ekleyin.

using System.Threading;
using System.Threading.Tasks;
using Azure.Messaging.ServiceBus;

İleti göndermek için, yeni ServiceBusClient bir nesne oluşturup bağlantı dizesi ve konunun adını geçirerek başlayın.

await using var client = new ServiceBusClient(connectionString);

Ardından, nesnede CreateSender ServiceBusClient yöntemini çağırarak ve konu adını belirterek bir ServiceBusSender nesne oluşturun.

ServiceBusSender sender = client.CreateSender(topicName);

yöntemini çağırıp ServiceBusSender.SendMessageAsync() geçirerek ServiceBusMessagekonuya bir ileti gönderebilirsiniz. Kuyruktaki gibi iletinin utf-8 kodlanmış dize biçiminde olması gerekir.

string message = "Cancel! I have changed my mind!";
var message = new ServiceBusMessage(message);

// Send the message to the topic.
await sender.SendMessageAsync(message);

Abonelikten ileti almak için

Bir abonelikten ileti almak için bir ServiceBusProcessor nesne oluşturup konu adını ve abonelik adını geçirmeniz gerekir.

processor = client.CreateProcessor(topicName, subscriptionName, options);

Ardından, bir ileti işleyicisi ve hata işleyicisi kaydedin.

// Specify the handler method for messages.
processor.ProcessMessageAsync += MessageHandler;

// Specify the handler method for errors.
processor.ProcessErrorAsync += ErrorHandler;

İşleme işlerinizi ileti işleyicisi içinde yapın, ardından iletiyi abonelikten kaldırmak için yöntemini çağırın ProcessMessageEventArgs.CompleteMessageAsync() .

// Complete the message. The message is deleted from the subscription. 
await args.CompleteMessageAsync(args.Message);