protected override async Task ProcessItem(string itemId, CancellationToken cancellationToken) { try { var workflow = await FetchWorkflow(itemId); WorkflowActivity.Enrich(workflow, "index"); await _searchIndex.IndexWorkflow(workflow); lock (_errorCounts) { _errorCounts.Remove(itemId); } } catch (Exception e) { Logger.LogWarning(default(EventId), $"Error indexing workfow - {itemId} - {e.Message}"); var errCount = 0; lock (_errorCounts) { if (!_errorCounts.ContainsKey(itemId)) { _errorCounts.Add(itemId, 0); } _errorCounts[itemId]++; errCount = _errorCounts[itemId]; } if (errCount < 5) { await QueueProvider.QueueWork(itemId, Queue); return; } if (errCount < 20) { await Task.Delay(TimeSpan.FromSeconds(10)); await QueueProvider.QueueWork(itemId, Queue); return; } lock (_errorCounts) { _errorCounts.Remove(itemId); } Logger.LogError(default(EventId), e, $"Unable to index workfow - {itemId} - {e.Message}"); } }
protected override async Task ProcessItem(string itemId, CancellationToken cancellationToken) { if (!await _lockProvider.AcquireLock(itemId, cancellationToken)) { Logger.LogInformation("Workflow locked {0}", itemId); return; } WorkflowInstance workflow = null; WorkflowExecutorResult result = null; try { cancellationToken.ThrowIfCancellationRequested(); workflow = await _persistenceStore.GetWorkflowInstance(itemId, cancellationToken); WorkflowActivity.Enrich(workflow, "process"); if (workflow.Status == WorkflowStatus.Runnable) { try { result = await _executor.Execute(workflow, cancellationToken); } finally { WorkflowActivity.Enrich(result); await _persistenceStore.PersistWorkflow(workflow, cancellationToken); await QueueProvider.QueueWork(itemId, QueueType.Index); _greylist.Remove($"wf:{itemId}"); } } } finally { await _lockProvider.ReleaseLock(itemId); if ((workflow != null) && (result != null)) { foreach (var sub in result.Subscriptions) { await SubscribeEvent(sub, _persistenceStore, cancellationToken); } await _persistenceStore.PersistErrors(result.Errors, cancellationToken); if ((workflow.Status == WorkflowStatus.Runnable) && workflow.NextExecution.HasValue) { var readAheadTicks = _datetimeProvider.UtcNow.Add(Options.PollInterval).Ticks; if (workflow.NextExecution.Value < readAheadTicks) { new Task(() => FutureQueue(workflow, cancellationToken)).Start(); } else { if (_persistenceStore.SupportsScheduledCommands) { await _persistenceStore.ScheduleCommand(new ScheduledCommand() { CommandName = ScheduledCommand.ProcessWorkflow, Data = workflow.Id, ExecuteTime = workflow.NextExecution.Value }); } } } } } }
protected override async Task ProcessItem(string itemId, CancellationToken cancellationToken) { if (!await _lockProvider.AcquireLock($"evt:{itemId}", cancellationToken)) { Logger.LogInformation($"Event locked {itemId}"); return; } try { cancellationToken.ThrowIfCancellationRequested(); var evt = await _eventRepository.GetEvent(itemId, cancellationToken); WorkflowActivity.Enrich(evt); if (evt.IsProcessed) { _greylist.Add($"evt:{evt.Id}"); return; } if (evt.EventTime <= _datetimeProvider.UtcNow) { IEnumerable <EventSubscription> subs = null; if (evt.EventData is ActivityResult) { var activity = await _subscriptionRepository.GetSubscription((evt.EventData as ActivityResult).SubscriptionId, cancellationToken); if (activity == null) { Logger.LogWarning($"Activity already processed - {(evt.EventData as ActivityResult).SubscriptionId}"); await _eventRepository.MarkEventProcessed(itemId, cancellationToken); return; } subs = new List <EventSubscription> { activity }; } else { subs = await _subscriptionRepository.GetSubscriptions(evt.EventName, evt.EventKey, evt.EventTime, cancellationToken); } var toQueue = new HashSet <string>(); var complete = true; foreach (var sub in subs.ToList()) { complete = complete && await SeedSubscription(evt, sub, toQueue, cancellationToken); } if (complete) { await _eventRepository.MarkEventProcessed(itemId, cancellationToken); } else { _greylist.Remove($"evt:{evt.Id}"); } foreach (var eventId in toQueue) { await QueueProvider.QueueWork(eventId, QueueType.Event); } } } finally { await _lockProvider.ReleaseLock($"evt:{itemId}"); } }