mam poniżej podstawowego owinięcia wokół kodu Azure Service Bus, że będziemy z użyciem w roli pracownika. Ta ServiceBusClient
zostanie utworzona za każdym razem, gdy uruchomiona zostanie rola robocza; następnie używany do uzyskania dostępu do kolejki, dopóki nie pozostały żadne pozostałe elementy do wyliczenia.Azure Service Bus Connection Client Trwałość
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);
}
}
Jak widać ja zainicjalizować NamespaceManager
, MessagingFactory
i QueueClient
wewnątrz konstruktora: są następnie ponownie wykorzystywane podczas wywoływania SendMessage()
i ReceiveTopMessage()
z połączeniem zamknięte stosując metodę Dispose()
.
Moje pytanie brzmi, czy podejście, które stosuję, to bezpieczne; będzie utrzymanie pojedynczą instancję QueueClient
otwarte podczas roli pracownika wylicza poprzez wszystkie wiadomości w kolejce (proces, który mógłby utrzymać połączenie otwarte przez dłuższy czas z długim oczekiwaniu pomiędzy wywołaniami ReceiveTopMessage()
) działają konsekwentnie bez przejściowych problemów, lub czy rozsądne jest każdorazowe otwieranie i zamykanie połączenia?
Jak z boku; w jaki sposób przebiega obsługa błędów przejściowych w kodzie usługi Microsoft Service Bus? Czy jest przeprowadzane domyślnie, czy też musimy wdrożyć Transient Fault Handling Framework?
Doskonałe linki dziękuję; Będę używał [Implement Reliable Message Receive Loops] (http://msdn.microsoft.com/en-us/library/windowsazure/hh851750.aspx) w naszym opakowaniu. Jeśli klasa 'QueueClient' nie otworzy połączenia; czy jest to obsługiwane automatycznie, gdy wywoływana jest metoda taka jak '.Receive()'? –
Wyjaśniłem moją odpowiedź z dodatkową dokumentacją dotyczącą zalecanego wzorca użytkowania i który obiekt obsługuje połączenie TCP. –
Moje pytanie jest związane z tym pytaniem, nie doceniam, jeśli możesz rzucić okiem: http://stackoverflow.com/questions/33512803/service-bus-singleton-connection-class @FernandoCorreia – Ron