Истек срок действия блокировки подписчика темы служебной шины Azure

У меня есть веб-задание, которое использует сообщение из темы служебной шины Azure, регистрируя OnMessage Перезвоните. Длительность блокировки сообщения была установлена ​​на 30 секунд, а тайм-аут возобновления блокировки - на 60 секунд. Так как такие задания, занимающие более 30 секунд для обработки сообщения служебной шины, получали исключение истекшей блокировки.

Теперь я установил длительность блокировки сообщения больше, чем время ожидания обновления блокировки. Но так или иначе это все еще бросает то же самое исключение. Я также перезапустил свою веб-работу, но все равно не повезло.

Я попытался запустить тот же webjob, потребляющий сообщения из другой темы с более поздними настройками, и он работает нормально. Ожидается ли такое поведение, и через сколько времени это изменение настроек обычно отражается.

Любая помощь будет отличной

2 ответа

Решение

Я установил длительность блокировки сообщения, превышающую время ожидания блокировки. Но так или иначе это все еще бросает то же самое исключение.

Максимальное значение длительности блокировки составляет 5 минут. Если вам требуется менее 5 минут для обработки задания, вы можете увеличить продолжительность блокировки вашего сообщения, чтобы удовлетворить ваши требования.

Если вам нужно больше 5 минут для обработки вашей работы, вам нужно установить свойство AutoRenewTimeout для OnMessageOptions. Он возобновит блокировку, если срок ее действия истек до того, как он достиг AutoRenewTimeout. Например, если вы установите длительность блокировки на 1 мин и установите AutoRenewTimeout на 5 мин. Сообщение будет заблокировано до 5 минут, если вы не снимите блокировку.

Вот пример кода, который я использовал для проверки продолжительности блокировки и AutoRenewTimeout на моей стороне. Если задание потратило больше времени, чем длительность блокировки и AutoRenewTimeout, при завершении сообщения будет выдано исключение (это означает, что истекло время ожидания). Я также изменил продолжительность блокировки на портале, и конфигурация будет применена немедленно, когда я получу сообщение.

SubscriptionClient Client = SubscriptionClient.CreateFromConnectionString(connectionString, "topic name", "subscription name");

// Configure the callback options.
OnMessageOptions options = new OnMessageOptions();
options.AutoComplete = false;
options.AutoRenewTimeout = TimeSpan.FromSeconds(60);

Client.OnMessage((message) =>
{
    try
    {
        //process the message here, I used following code to simulation a long time spent job
        for (int i = 0; i < 30; i++)
        {
            Thread.Sleep(3000);
        }
        // Remove message from subscription.
        message.Complete();
    }
    catch (Exception ex)
    {
        // Indicates a problem, unlock message in subscription.
        message.Abandon();
    }
}, options);

Для вашей проблемы, пожалуйста, проверьте, сколько времени будет потрачено на вашу работу, и выберите правильный способ установить продолжительность блокировки и AutoRenewTimeout.

Настройки должны быть отражены практически сразу. Также обновление блокировки, вероятно, должно быть больше, чем продолжительность блокировки или отключена.

Функция обновления блокировки - это функция клиента ASB, которая не переопределяет длительность блокировки, установленную для объектов. Если вы можете воспроизвести эту проблему и поделиться ей, поднимите вопрос о поддержке в Microsoft.

Другие вопросы по тегам