В 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);