private async Task PollCommands() { var activity = WorkflowActivity.StartPoll("commands"); try { if (!_persistenceStore.SupportsScheduledCommands) { return; } if (await _lockProvider.AcquireLock("poll-commands", new CancellationToken())) { try { _logger.LogDebug("Polling for scheduled commands"); await _persistenceStore.ProcessCommands(new DateTimeOffset(_dateTimeProvider.UtcNow), async (command) => { switch (command.CommandName) { case ScheduledCommand.ProcessWorkflow: await _queueProvider.QueueWork(command.Data, QueueType.Workflow); break; case ScheduledCommand.ProcessEvent: await _queueProvider.QueueWork(command.Data, QueueType.Event); break; } }); } finally { await _lockProvider.ReleaseLock("poll-commands"); } } } catch (Exception ex) { _logger.LogError(ex, ex.Message); activity?.RecordException(ex); } finally { activity?.Dispose(); } }
private async Task PollWorkflows() { var activity = WorkflowActivity.StartPoll("workflows"); try { if (await _lockProvider.AcquireLock("poll runnables", new CancellationToken())) { try { _logger.LogDebug("Polling for runnable workflows"); var runnables = await _persistenceStore.GetRunnableInstances(_dateTimeProvider.Now); foreach (var item in runnables) { if (_persistenceStore.SupportsScheduledCommands) { try { await _persistenceStore.ScheduleCommand(new ScheduledCommand() { CommandName = ScheduledCommand.ProcessWorkflow, Data = item, ExecuteTime = _dateTimeProvider.UtcNow.Ticks }); continue; } catch (Exception ex) { _logger.LogError(ex, ex.Message); activity?.RecordException(ex); } } if (_greylist.Contains($"wf:{item}")) { _logger.LogDebug($"Got greylisted workflow {item}"); continue; } _logger.LogDebug("Got runnable instance {0}", item); _greylist.Add($"wf:{item}"); await _queueProvider.QueueWork(item, QueueType.Workflow); } } finally { await _lockProvider.ReleaseLock("poll runnables"); } } } catch (Exception ex) { _logger.LogError(ex, ex.Message); activity?.RecordException(ex); } finally { activity?.Dispose(); } }