Кажется, что QueueClient.Complete (Guid) не работает при постановке в очередь другого сообщения в вызываемой функции очереди служебной шины. - PullRequest
0 голосов
/ 02 апреля 2019

В Azure WebJobs в классе OnMessageOptions я вызываю метод QueueClient.Complete(Guid), устанавливая флаг AutoComplete в значение true , и сообщения, кажется, просто удаляются из очереди при запуске функции ProcessQueue,Количество активных сообщений уменьшается на 1 после успешной обработки каждого сообщения.Однако, когда я хочу отправить сообщение (потому что оно не может быть обработано в настоящее время) обратно в очередь, которая запускает функцию служебной шины, в виде нового сообщения с посредником через минуту, используя BrokeredMessage.ScheduledEnqueueTimeUtc, кажется, что оно не работает,Кажется, что количество запланированных сообщений изначально увеличилось.Через несколько часов я возвращаюсь в очередь и вижу тысячи активных сообщений.Копии одного и того же сообщения.Что происходит?Я ожидаю, что сообщение будет удалено из очереди из-за QueueClient.Complete(Guid), а новое запланированное сообщение будет его заменой.

Некоторые детали:

ОтправитьВ сообщении я делаю следующее:

var queueclient = QueueClient.CreateFromConnectionString(connectionString, queueName);
queueclient.Send(message);
queueclient.close();

Внутри WebJob я создал объект ServiceBusConfiguration, для которого требуется объект onMessageOptions, в котором я установил AutoComplete=true.Я передаю объект ServiceBusConfiguration методу JobHostConfiguration.UserServiceBus.

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

// если он еще не доступен для обработки, пожалуйста, запросите ...

var queueclient = QueueClient.CreateFromConnectionString(connectionString, queueName);
    queueclient.Send(message);
    queueclient.close();

I not выполните следующие / используйте обратные вызовы, возможно, поэтомуt работает?

var options = new OnMessageOptions();
options.AutoComplete = false;  // to call complete ourselves

Обратный вызов для обработки полученных сообщений

client.OnMessage(m =>
{

    var clone = m.Clone();
    clone.ScheduledEnqueueTimeUtc = DateTime.UtcNow.AddSeconds(60);
    client.Send(clone);


    m.Complete();

}, options);

1 Ответ

2 голосов
/ 02 апреля 2019

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

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

BrokeredMessage.ScheduledEnqueueTimeUtc предназначен для использования в сообщениях, добавляемых в очередь.Когда вы получаете сообщение, вы можете заполнить его, отправить в тупик, отложить или отказаться.Если вы оставите сообщение, оно будет повторено, но вы не можете контролировать, когда это произойдет.Если у вас нет других сообщений в очереди, они будут повторены почти немедленно.

Примечание: если вы видите, что поведение, которое вы подозреваете, является неправильным, было бы очень полезно иметь простое повторение для обмена.

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