Я пишу веб-задание, используя. NET Core 3.1, и мой триггер выглядит так:
public async Task ProcessQueueMessage([ServiceBusTrigger("%ServiceBusProviderConfig:TopicName%", "%ServiceBusProviderConfig:TopicSubscriptionName%", Connection = "ServiceBusConnectionString")] Message message, MessageReceiver messageReceiver, TraceWriter log, TextWriter textWriter)
Я обрабатываю сообщение и вызываю полные / мертвые буквы в соответствии с требованиями следующим образом:
await messageReceiver.CompleteAsync(message.SystemProperties.LockToken);
await messageReceiver.DeadLetterAsync(message.SystemProperties.LockToken);
Однако это вызывает ошибку: The lock supplied is invalid. Either the lock expired, or the message has already been removed from the queue, or was received by a different receiver instance.
Я понимаю, что мне нужно каким-то образом установить для параметра Autocomplete в MessageHandlerOptions значение false, чтобы веб-задание не завершало его автоматически и не удаляло из очереди.
Но мне трудно установить это значение. Я пробовал:
установив это в appsettings. json файл следующим образом:
"extensions": {"serviceBus": {"messageHandlerOptions": {" maxConcurrentCalls ": 16," autoComplete ": false}}}
Но при запуске он не выбирает настройки из этого файла. Я не уверен, почему, как мне сделать так, чтобы настройки считывались из локального файла конфигурации?
Я также попытался создать объект для MessageHandlerOptions, но в подписи отсутствует обязательный параметр, что делает это невозможным. Например:
var messageHandlerOptions = new MessageHandlerOptions(ExceptionHandler)
{
AutoComplete = false,
MaxAutoRenewDuration = new TimeSpan(0, 5, 0), // 5 minutes
MaxConcurrentCalls = 1,
};
messageReceiver.RegisterMessageHandler(MessageProcessor, messageHandlerOptions);
stati c asyn c Task MessageProcessor (сообщение сообщения, токен CancellationToken) {await messageReceiver.CompleteAsyn c (message.SystemProperties.LockToken); }
Я не могу получить доступ к messageReceiver
в MessageProcessor
, и поэтому это тоже невозможно.
Кто-нибудь может предложить, как я могу установить ServiceBusOptions в файл конфигурации для чтения во время выполнения?
FYI, я использую следующие пакеты:
1. Microsoft.Azure.ServiceBus Version="4.1.3"
2. Microsoft.Azure.WebJobs.Extensions Version="3.0.0"
3. Microsoft.Azure.WebJobs.Extensions.ServiceBus Version="3.0.0"
4. Microsoft.Azure.WebJobs.Extensions.Storage Version="4.0.2"
5. Microsoft.Azure.WebJobs.Logging.ApplicationInsights Version="3.0.14"