public async Task <string> StartWorkflow <TData>(string workflowId, int?version, TData data = null, string reference = null) where TData : class, new() { var def = _registry.GetDefinition(workflowId, version); if (def == null) { throw new WorkflowNotRegisteredException(workflowId, version); } var wf = new WorkflowInstance { WorkflowDefinitionId = workflowId, Version = def.Version, Data = data, Description = def.Description, NextExecution = 0, CreateTime = _dateTimeProvider.UtcNow, Status = WorkflowStatus.Runnable, Reference = reference }; if ((def.DataType != null) && (data == null)) { if (typeof(TData) == def.DataType) { wf.Data = new TData(); } else { wf.Data = def.DataType.GetConstructor(new Type[0]).Invoke(new object[0]); } } wf.ExecutionPointers.Add(_pointerFactory.BuildGenesisPointer(def)); using (var scope = _serviceProvider.CreateScope()) { var middlewareRunner = scope.ServiceProvider.GetRequiredService <IWorkflowMiddlewareRunner>(); await middlewareRunner.RunPreMiddleware(wf, def); } string id = await _persistenceStore.CreateNewWorkflow(wf); await _queueProvider.QueueWork(id, QueueType.Workflow); await _queueProvider.QueueWork(id, QueueType.Index); await _eventHub.PublishNotification(new WorkflowStarted { EventTimeUtc = _dateTimeProvider.UtcNow, Reference = reference, WorkflowInstanceId = id, WorkflowDefinitionId = def.Id, Version = def.Version }); return(id); }
private async void Execute() { var cancelToken = _cancellationTokenSource.Token; while (!cancelToken.IsCancellationRequested) { try { if (!SpinWait.SpinUntil(() => _outbox.Count > 0, 1000)) { continue; } if (_outbox.TryDequeue(out LifeCycleEvent evt)) { await _eventHub.PublishNotification(evt); } } catch (OperationCanceledException) { } catch (Exception ex) { _logger.LogError(ex.Message); } } }
public async Task <string> StartWorkflow <TData>(string workflowId, int?version, TData data = null, string reference = null) where TData : class, new() { var def = _registry.GetDefinition(workflowId, version); if (def == null) { throw new WorkflowNotRegisteredException(workflowId, version); } var wf = new WorkflowInstance { WorkflowDefinitionId = workflowId, Version = def.Version, Data = data, Description = def.Description, NextExecution = 0, CreateTime = DateTime.Now.ToUniversalTime(), Status = WorkflowStatus.Runnable, Reference = reference }; if ((def.DataType != null) && (data == null)) { wf.Data = new TData(); } wf.ExecutionPointers.Add(_pointerFactory.BuildGenesisPointer(def)); string id = await _persistenceStore.CreateNewWorkflow(wf); await _queueProvider.QueueWork(id, QueueType.Workflow); await _eventHub.PublishNotification(new WorkflowStarted() { EventTimeUtc = DateTime.UtcNow, Reference = reference, WorkflowInstanceId = id, WorkflowDefinitionId = def.Id, Version = def.Version }); return(id); }
private async void Execute() { foreach (var evt in _outbox.GetConsumingEnumerable()) { try { await _eventHub.PublishNotification(evt); } catch (Exception ex) { _logger.LogError(default(EventId), ex, ex.Message); } } }