我有一个Azure Service Bus主题订阅,消息不断增加。
下面的代码基本上是一次接收一条消息并将其处理并将相关结果存储到数据库中。
我尝试设置MaxConcurrentCalls to 10
,但是由于数据库的工作设计,它耗尽了我的数据库连接池。
因此,我想一次从订阅中获取10条消息(以N条消息的批次接收),并希望通过一个数据库调用进行处理。
我没有看到任何批处理api选项,这可能吗?
我正在使用Microsoft.Azure.ServiceBus
nuget版本4.1.1
。
_subscriptionClient = new SubscriptionClient(connectionString, topicName, subscriptionName);
// Register the callback method that will be invoked a message of interest is received
_subscriptionClient.RegisterMessageHandler(
async (message, token) =>
{
if (await ProcessMessage(message, token))
{
await _subscriptionClient.CompleteAsync(message.SystemProperties.LockToken);
}
},
new MessageHandlerOptions(ExceptionReceivedHandler) { MaxConcurrentCalls = 1, AutoComplete = false });
答案 0 :(得分:1)
通过预取,队列或订阅客户端可以在执行接收操作时从服务中加载其他消息。
示例:
SubscriptionClient client = SubscriptionClient.CreateFromConnectionString(connectionString, topic, subName);
client.PrefetchCount = 10;
IEnumerable<BrokeredMessage> messageList = client.ReceiveBatch(5);
Prefetch应该大于或等于您期望从ReceiveBatch接收的消息数。
Prefetch最多可以是每秒处理的消息数的n / 3倍,其中n是默认锁定持续时间。