Служба Azure Bus Exception при попытке завершить сообщение - PullRequest
0 голосов
/ 04 сентября 2018

Я использую пример GitHub для обработки сообщений темы:

private void RegisterSubscriptionClientMessageHandler()
        {
            _subscriptionClient.RegisterMessageHandler(
                async (message, token) =>
                {
                    var eventName = $"{message.Label}{INTEGRATION_EVENT_SUFIX}";
                    var messageData = Encoding.UTF8.GetString(message.Body);
                    await ProcessEvent(eventName, messageData);

                    // Complete the message so that it is not received again.
                    await _subscriptionClient.CompleteAsync(message.SystemProperties.LockToken);
                },
               new MessageHandlerOptions(ExceptionReceivedHandler) { MaxConcurrentCalls = 10, AutoComplete = false });
        }

Все сообщения успешно отправляются и принимаются всеми подписчиками, однако в команде:

await _subscriptionClient.CompleteAsync(message.SystemProperties.LockToken);

Всегда возникает следующая ошибка:

 ERROR ON ExceptionReceivedHandler EXEPTION: 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.
Bazinga.EventBus.Bus.EventBusSubscription:Error: ERROR ON ExceptionReceivedHandler EXEPTION: 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.
- Executing Action: UserCallback

Любые советы, как решить? Спасибо!

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Другой основной причиной этого будет Автозаполнение включено по умолчанию.

Всякий раз, когда вы используете CompleteAsync (), вам также следует создать экземпляр объекта OnMessageOptions, чтобы установить для набора AutoComplete значение false, и передать его в вызов OnMessage.

OnMessageOptions onMessageOpt = new OnMessageOptions();
onMessageOpt.AutoComplete = false;

client.OnMessage(processCalculations, options);

См. Это Аналогичное решение SO

0 голосов
/ 04 сентября 2018

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

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

Каждая подписка на очередь и тему имеет свойство Блокировать длительность. На основании промежутка времени, настроенного для длительности блокировки, срок действия блокировки, поставляемой с сообщением, истечет.

Здесь вы выполняете некоторую обработку await ProcessEvent(eventName, messageData); перед завершением сообщения.

Проблема должна заключаться в том, что срок действия блокировки истек до выполнения строки _subscriptionClient.CompleteAsync(message.SystemProperties.LockToken);.

Увеличение продолжительности блокировки или завершение сообщения перед вызовом ProcessEvent решит вашу проблему.

...