下面是我们将在辅助角色中使用的 Azure 服务总线代码的基本包装器。这ServiceBusClient
将在每次运行工作者角色时实例化;然后用于访问队列,直到没有剩余的项目可以枚举。
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 服务总线代码中的瞬态故障处理是如何进行的?它是默认执行的还是我们需要实现瞬态故障处理框架?