Ç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?
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? –
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. –
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