2013-07-11 28 views
9

Çalışan rolünde kullanacağımız Azure Service Bus kodu hakkında temel bir sargı parçasının altına sahibim. Çalışan rolü her çalıştırıldığında bu ServiceBusClient başlatılacak; Daha sonra sıraya girecek kalan öğe kalmayıncaya kadar kuyruğa erişmek için kullanılır.Azure Service Bus İstemcisi Bağlantı Sürekliliği

public class ServiceBusClient : IDisposable, IServiceBusClient 
{ 
    private const int DEFAULT_WAIT_TIME_IN_SECONDS = 120; 

    private const string SERVICE_BUS_CONNECTION_STRING_KEY = "service.bus.connection.string"; 

    private readonly MessagingFactory _messagingFactory; 

    private readonly NamespaceManager _namespaceManager; 

    private readonly QueueClient _queueClient; 

    private readonly ISettingsManager _settingsManager; 

    public ServiceBusClient(ISettingsManager settingsManager, string queueName) 
    { 
     _settingsManager = settingsManager; 

     var connectionString = _settingsManager.GetSetting<string>(SERVICE_BUS_CONNECTION_STRING_KEY); 

     _namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString); 
     _messagingFactory = MessagingFactory.CreateFromConnectionString(connectionString); 

     _queueClient = GetOrCreateQueue(queueName); 
    } 

    public void Dispose() 
    { 
     _messagingFactory.Close(); 
    } 

    public BrokeredMessage ReceiveTopMessage() 
    { 
     return _queueClient.Receive(TimeSpan.FromSeconds(DEFAULT_WAIT_TIME_IN_SECONDS)); 
    } 

    public void SendMessage(object bodyObject) 
    { 
     var message = new BrokeredMessage(bodyObject); 

     _queueClient.Send(message); 
    } 

    private QueueClient GetOrCreateQueue(string queueName) 
    { 
     var queue = !_namespaceManager.QueueExists(queueName) 
         ? _namespaceManager.CreateQueue(queueName) 
         : _namespaceManager.GetQueue(queueName); 

     return _messagingFactory.CreateQueueClient(queue.Path, ReceiveMode.PeekLock); 
    } 

} 

ben kurucu içinde NamespaceManager, MessagingFactory ve QueueClient initialize görebileceğiniz gibi: bağlantı Dispose() yöntemi kullanılarak kapalı olan SendMessage() ve ReceiveTopMessage() çağrılırken o zaman tekrar kullanılmaktadır.

Sorum şu ki kullanıyorum yaklaşımın güvenli; Bir çalışan rolü sıradaki tüm iletilerden (ReceiveTopMessage() çağrıları arasında uzun bir bekleyişle bağlantıyı uzun süre açık tutabilecek bir işlem) geçici sorunlar olmaksızın tutarlı bir şekilde çalışarak QueueClient tek bir örneğini açık tutacak veya Her seferinde bağlantıyı açmak ve kapatmak akıllıca mı?

Microsoft Hizmet Veri Yolu kodunda geçici hata işleme nasıl yapılır? Varsayılan olarak mı çalışıyor yoksa Transient Fault Handling Framework'u mı uygulamamız gerekiyor?

cevap

9

QueueClient class, oluşturmak için kullanılan MessagingFactory nesnesi tarafından yönetilen bir bağlantı kullanır. Aynı istemci nesnesini birden çok istek için yeniden kullanmanız önerilir. Best Practices for Performance Improvements Using Service Bus Brokered Messaging belgelenen gibi: Servis Otobüs istemci protokolü ve HTTP:

Servis Otobüs iki protokolleri aracılığıyla mesaj göndermek ve almak için müşterilerine sağlar. Service Bus istemci protokolü daha verimli olduğundan, ileti fabrikası olduğu sürece Hizmet Veri Yolu hizmetine bağlantısını korur. , aynı zamanda yığınlama ve ön yükleme uygular. Hizmet Yöneticisi istemcisi protokolü, .NET yönetilen API kullanarak .NET uygulamaları için kullanılabilir. (...) Service Bus istemci nesneleri, QueueClient veya MessageSender gibi, iç yönetim bağlantıları sağlayan bir MessagingFactory nesnesi aracılığıyla oluşturulan vardır. Bir iletisini gönderdikten sonra fabrikaları veya kuyruğu, konu ve abonelik istemcilerini kapatmamalı ve bir sonraki iletiyi gönderdiğinizde yeniden oluşturmalısınız. Bir ileti fabrikasının kapatılması, Hizmet Veri Yolu hizmetinin bağlantısını siler ve ürününü yeniden oluştururken yeni bir bağlantı kurulur. Bir bağlantı kurmak, 'un birden fazla işlem için aynı fabrika ve istemci nesnelerini yeniden kullanarak önlenebilecek pahalı bir işlemdir. (...) tarafından oluşturulan ve aynı fabrika tarafından gönderilen tüm istemciler (alıcılara ek olarak gönderenler) bir TCP bağlantısı paylaşır. geçici arıza işleme ilişkin

, QueueClient bu istek yeniden gerekli olup olmadığını belirler bir RetryPolicy property sahiptir. Geçici arıza işleme çerçevesinin yerini alan Transient Fault Handling Application Block da var.

Mesaj alma döngüleri ile ilgili olarak, Implementing Reliable Message Receive Loops numaralı telefondan rehberlik vardır.Microsoft, iyi yazılmış, esnek bir ileti alma döngüsü uygulamakta zorlandığının farkına varmıştır, bu yüzden Event-Driven Message Programing Model'u alternatif olarak tanıttılar.

+1

Mükemmel Linkler Teşekkür ederiz; Sarma paketimizde [Güvenli Güvenilir Alım Alıcılar Uygula] (http://msdn.microsoft.com/en-us/library/windowsazure/hh851750.aspx) kullanıyorum. QueueClient sınıfı bağlantıyı açmazsa; .Receive() 'gibi bir yöntem çağrıldığında bu otomatik olarak ele alınır? –

+1

Yanıtımı önerilen kullanım deseni hakkında ek belgelere ve TCP bağlantısının hangi nesneyi işlediğine açıklık getirdim. –

+0

Soruma göz at Bu soruyla ilgili sorularınız varsa lütfen şu soruları yanıtlayın: http://stackoverflow.com/questions/33512803/service-bus-singleton-connection-class @FernandoCorreia – Ron

İlgili konular