Действия по воспроизведению
Добавляйте сообщения в очередь (около 500 сообщений). Добавьте приложение-функцию, запускаемую очередью, которое будет обрабатывать сообщения очереди.
Ожидаемое поведение
Все сообщения из очереди обрабатываются. Если во время обработки сообщения возникает исключение, оно отправляется в очередь подозрений.
Фактическое поведение
Сообщения начинают обрабатываться. Через некоторое время (где-то около 30-60 секунд) все сообщения, оставшиеся в очереди, перемещаются в очередь подозрений. Никаких исключений для сообщений, которые обрабатываются в этот момент, не возникает.
Мы проверили, что время жизни сообщения в очереди задано по умолчанию: 7 дней. Мы попытались понизить версию пакета WindowsAzure.Storage до 7.2.1, но безуспешно.
Версия WindowsAzure.Storage, которую мы используем, - 8.5.0.
Возможно ли, что приложение-функция выйдет из строя, и это приведет к перемещению всех сообщений в очередь подозрений?
ИЗМЕНИТЬ
Вот как сообщения добавляются в очередь:
public async Task AddMessage()
{
var queueModel = new QueueModel
{
// queue model properties
};
await AddMessageToQueueAsync(queueModel);
}
public async Task AddMessageToQueueAsync(T messageObject, TimeSpan? initialVisibilityDelay = null)
{
var queue = GetQueue();
var jsonMessage = JsonConvert.SerializeObject(messageObject);
var message = new CloudQueueMessage(jsonMessage);
await queue.AddMessageAsync(message, TimeSpan.FromDays(7), initialVisibilityDelay, new QueueRequestOptions(), new OperationContext());
}
private CloudQueue GetQueue()
{
var queueClient = _storageAccount.CreateCloudQueueClient();
var queue = queueClient.GetQueueReference(_queueName);
queue.CreateIfNotExists();
return queue;
}
И это приложение-функция, которое обрабатывает сообщения:
[FunctionName("ProcessQueue")]
public static async Task Run([QueueTrigger("queue-name", Connection = "AzureWebJobsStorage")]string queueItem, TraceWriter log)
{
if (String.IsNullOrEmpty(queueItem))
{
return;
}
var queueModel = JsonConvert.DeserializeObject<QueueModel>(queueItem);
if (queueModel == null)
{
return;
}
try
{
// process the message
}
catch (Exception ex)
{
// message is moved to the poison-queue but no exception is thrown
log.Error(ex.Message, ex);
}
}