Luk*_*ett 11 c# client azure azureservicebus
我有一个围绕Azure Service Bus代码的基本包装器,我们将在一个辅助角色中使用它.这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);
}
}
Run Code Online (Sandbox Code Playgroud)
正如你可以看到我初始化NamespaceManager
,MessagingFactory
并QueueClient
在构造函数中:他们打电话时,然后再利用SendMessage()
,并ReceiveTopMessage()
与连接使用封闭Dispose()
法.
我的问题是我使用的方法是否安全 ; 将一个单独的QueueClient
open 实例保留,而一个worker角色通过队列中的所有消息进行枚举(一个可以保持连接打开很长一段时间并且在调用之间等待很长时间的过程ReceiveTopMessage()
)一致地工作而没有短暂的问题,或者是每次都要谨慎地打开和关闭连接?
作为旁白; 如何在Microsoft Service Bus代码中进行瞬态故障处理?它是默认执行还是我们需要实现瞬态故障处理框架?
Fer*_*eia 11
的QueueClient
类使用由用于创建它的MessagingFactory对象管理的连接.建议为多个请求重用相同的客户端对象.如使用Service Bus Brokered Messaging进行性能改进的最佳实践中所述:
Service Bus使客户端能够通过两种协议发送和接收消息:Service Bus客户端协议和HTTP.Service Bus客户端协议更有效,因为只要消息工厂存在,它就会保持与Service Bus服务的连接.它还实现了批处理和预取.Service Bus客户端协议可用于使用.NET托管API的.NET应用程序.(...)Service Bus客户端对象(如QueueClient或MessageSender)是通过MessagingFactory对象创建的,该对象还提供连接的内部管理.发送消息后,不应关闭消息传递工厂或队列,主题和订阅客户端,然后在发送下一条消息时重新创建它们.关闭消息传递工厂将删除与Service Bus服务的连接,并在重新创建工厂时建立新连接.建立连接是一项昂贵的操作,可以通过为多个操作重用相同的工厂和客户端对象来避免这种操作.(...)由同一工厂创建的所有客户端(除接收器之外的发件人)共享一个TCP连接.
关于瞬态故障处理,QueueClient
具有RetryPolicy属性,该属性确定是否应重试请求.还有瞬态故障处理应用程序块,它取代了瞬态故障处理框架.
关于消息接收循环,有实现可靠消息接收循环的指导.微软已经认识到很难实现一个写得很好,有弹性的消息接收循环,所以他们已经引入了事件驱动的消息编程模型作为替代方案.
归档时间: |
|
查看次数: |
7712 次 |
最近记录: |