/// <summary> /// Processes a single queue item /// </summary> /// <param name="queueItem"></param> /// <param name="persistDocument"></param> /// <returns></returns> async Task ProcessSingleItem(InternalCosmosDBQueueItem queueItem, bool persistDocument) { // Persist document only if Auto complete is enabled persistDocument = persistDocument & this.settings.AutoComplete; try { var externalQueueItem = new CosmosDBQueueItem(this, queueItem); var handlerStatus = await OnMessage(externalQueueItem); if (handlerStatus) { if (this.settings.AutoComplete) { queueItem.SetAsComplete(); } this.logger?.LogTrace($"Processing item {queueItem.id} succeeded"); } else { if (this.settings.AutoComplete) { queueItem.SetAsPending(); queueItem.errors++; } this.logger?.LogTrace($"Processing item {queueItem.id} failed"); } } catch (Exception ex) { this.logger?.LogError(ex, $"Error processing queue item {queueItem.id}"); queueItem.errors++; queueItem.SetAsPending(); // If the message handler failed we saved as failed persistDocument = true; } if (persistDocument) { await SaveQueueItem(queueItem); } }
/// <summary> /// Completes the message queue /// </summary> /// <param name="queueItem"></param> /// <returns></returns> public async Task Complete(InternalCosmosDBQueueItem queueItem) { queueItem.SetAsComplete(); await SaveQueueItem(queueItem); }