我有一個圍繞Azure服務總線代碼的基本包裝,我們將在一個輔助角色中使用它。這個ServiceBusClient
將在每次工作者角色運行時被實例化;然後用於訪問隊列,直到沒有剩餘的項目可以枚舉爲止。Azure服務總線客戶端連接持久性
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);
}
}
正如你可以看到我初始化NamespaceManager
,MessagingFactory
和QueueClient
在構造函數中:他們是那麼重用調用SendMessage()
和ReceiveTopMessage()
與連接使用Dispose()
方法關閉時。
我的問題是我使用的方法是否安全;將保持一個QueueClient
的實例處於打開狀態,而工作者角色通過隊列上的所有消息枚舉(可以保持連接打開很長一段時間,在ReceiveTopMessage()
的調用之間長時間等待)可以一致地工作,而不會出現瞬時問題,或者每次打開和關閉連接是否審慎?
另外;在Microsoft Service Bus代碼中如何進行瞬態故障處理?它是默認進行還是我們需要執行Transient Fault Handling Framework?
優秀的鏈接謝謝你;我將在我們的封裝器中使用[實現可靠的消息接收循環](http://msdn.microsoft.com/en-us/library/windowsazure/hh851750.aspx)。如果'QueueClient'類不打開連接;當調用諸如'.Receive()'的方法時,會自動處理它嗎? –
我已經澄清了我的答案,並提供了有關推薦使用模式和哪個對象處理TCP連接的其他文檔。 –
我的問題與這個問題有關,如果你可以看看,不好意思:http://stackoverflow.com/questions/33512803/service-bus-singleton-connection-class @FernandoCorreia – Ron