在这方面,我很难从 Google 那里获得好评。我有一个 Web 应用程序,它使用 QueueClient 来在用户创建记录时对消息进行排队。我想要的是一种“开枪即忘,但在合理范围内信任”的方式。也就是说:
- 我希望能够向总线发送消息并立即返回(因此用户不必等待
- 我希望消息在本地汇集(缓冲?批处理?),以便系统在给定的时间段内一次发送 1、5、50 个。所以“当缓冲区大于 10 或 5 秒时发送
- 缓冲区被分页到磁盘,这样如果系统重新启动或其他什么,它将尝试再次传递
- 如果一切都失败了,哦,好吧。
我觉得我已经阅读了 QueueClient 中的缓冲/批处理,但现在我找不到任何关于它的信息。在 Web 应用程序中跨线程(请求)重用 QueueClients 是否安全?
有没有人有建议的模式或框架来实现上述目标?
目前,我在静态变量 (_client) 中缓存了一个共享的 QueueClient - 也许这是不正确的。我应该缓存和重用客户端还是工厂?
private static QueueClient GetQueueClient()
{
if (_client == null || _client.IsClosed)
{
// Create management credentials
TokenProvider credentials = TokenProvider.CreateSharedSecretTokenProvider(
Settings.ServiceBusIssuer,
Settings.ServiceBusIssuerKey);
//create the client object for the queue
MessagingFactory factory = MessagingFactory.Create(ServiceBusEnvironment.CreateServiceUri("sb", "Magic", string.Empty), credentials);
string queueName = Crelate.Properties.Settings.Default.ServiceBusQueueName;
QueueClient client = factory.CreateQueueClient(queueName);
_client = client;
return client;
}
return _client;
}
然后我这样做,这绝对不是我想要的:
QueueClient client = GetQueueClient();
BrokeredMessage msg = new BrokeredMessage(opInfo);
msg.MessageId = "SomeUsefulId";
await Task.Factory.FromAsync(client.BeginSend, client.EndSend, msg, null);
感谢您的时间和想法。
当然,在写完这一切之后,我发现了以下内容:
http://msdn.microsoft.com/en-us/library/hh528527.aspx(其中提到了客户端批处理和重试逻辑)