Как установить автозаполнение в MessageHandlerOptions в Azure Service Bus Options (используя Net Core 3.1) - PullRequest
0 голосов
/ 09 июля 2020

Я пишу веб-задание, используя. 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, чтобы веб-задание не завершало его автоматически и не удаляло из очереди.

Но мне трудно установить это значение. Я пробовал:

  1. установив это в 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"

Ответы [ 2 ]

1 голос
/ 09 июля 2020

После долгих поисков наконец нашел ответ. Отправка для всех, кто ищет тот же вопрос:

    services.AddServiceBus(options =>
    {
        options.ConnectionString = "ServiceBusConnectionString";
        options.MessageHandlerOptions.AutoComplete = false;
        options.PrefetchCount = 1;
        options.MessageHandlerOptions.MaxConcurrentCalls = 1;
    });
0 голосов
/ 10 июля 2020

Последний комментарий к https://github.com/Azure/azure-functions-servicebus-extension/issues/34 помог мне настроить его на хосте. json

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...