public async Task RunContainer(IServiceProvider serviceProvider, WorkflowContainer container, CancellationToken cancellationToken) { var workflowService = serviceProvider.GetRequiredService <IWorkflowService>(); var workflowInstance = workflowService.Create(container); var t = workflowInstance.GetType(); var method = t.GetMethod("Execute", BindingFlags.Instance | BindingFlags.Public); var arguments = method.GetParameters() .Select(a => a.ParameterType == typeof(CancellationToken) ? cancellationToken : serviceProvider.GetService(a.ParameterType)) .ToArray(); try { container.State = WorkflowStatusType.Running.ToString(); workflowService.Save(workflowInstance); if (typeof(Task).Equals(method.ReturnType)) { await(Task) method.Invoke(workflowInstance, arguments); } else { method.Invoke(workflowInstance, arguments); } } finally { if (container.State == WorkflowStatusType.Running.ToString()) { container.State = WorkflowStatusType.Waiting.ToString(); workflowService.Save(workflowInstance); } } }
public List <object> Execute(IEnumerable <IWorkflowRequest> requests) { var lastResultWasAdded = false; var results = new List <object>(); var lastResult = default(object); foreach (var request in requests) { var workflow = new WorkflowContainer(request); if (workflow.Operand == WorkflowOperand.UseLastResult) { if (lastResultWasAdded) { results.RemoveAt(results.Count - 1); } } lastResult = Execute(workflow, lastResult); if (workflow.Evaluate && workflow.Operand != WorkflowOperand.FireAndForget) { lastResultWasAdded = true; results.Add(lastResult); } else { lastResultWasAdded = false; } } return(results); }
public T Create <T>(WorkflowContainer container) where T : class, IWorkflowContext { var instance = JsonConvert.DeserializeObject <T>(container.Data); instance.Container = container; instance.WorkflowService = this; return(instance); }
/// <summary> /// Stores a new workflow. /// </summary> /// <param name="workflow"></param> public override void Save(Workflow workflow) { using (IDocumentSession session = this.OpenSession()) { WorkflowContainer wc = new WorkflowContainer(workflow); session.Store(wc); session.SaveChanges(); } }
/// <summary> /// Deletes a workflow from the active database store/collection. /// </summary> /// <param name="id">The workflow id.</param> public override void Delete(Guid id) { using (IDocumentSession session = this.OpenSession()) { WorkflowContainer wf = session.Load <WorkflowContainer>(id); session.Delete <WorkflowContainer>(wf); session.SaveChanges(); } }
public WorkflowContext() { Container = new WorkflowContainer { Type = GetType().AssemblyQualifiedName, State = WorkflowStatusType.New.ToString() }; Logs = new List <WorkflowLog>(); }
public IWorkflowContext Create(WorkflowContainer container) { var type = Type.GetType(container.Type); var instance = Deserialize(type, container.Data); instance.Container = container; instance.WorkflowService = this; return(instance); }
/// <summary> /// Updates the specified workflow. /// </summary> /// <param name="workflow">The workflow.</param> public override void Save(Workflow workflow) { var coll = GetCollection(); WorkflowContainer wc = new WorkflowContainer(workflow); coll.ReplaceOne(x => x.Id == wc.Id, wc, new UpdateOptions() { IsUpsert = true }); }
/// <summary> /// Gets an active workflow by it's unique identifier, returning null if it does not exist. /// </summary> /// <param name="id"></param> /// <returns></returns> /// <exception cref="System.NotImplementedException"></exception> public override Workflow GetOrDefault(Guid id) { Workflow workflow = null; var collection = GetCollection(); WorkflowContainer wc = collection.Find(x => x.Id == id).SingleOrDefault(); if (wc != null) { workflow = wc.Workflow; } return(workflow); }
/// <summary> /// Archives a workflow, moving it into the completed store. /// </summary> /// <param name="workflow">The workflow to archive.</param> public override void Archive(Workflow workflow) { using (IDocumentSession session = this.OpenSession()) { WorkflowContainer wf = session.Load <WorkflowContainer>(workflow.Id); session.Delete <WorkflowContainer>(wf); session.Store(new CompletedWorkflow(wf.Workflow)); session.SaveChanges(); } }
/// <summary> /// Saves a collection of existing workflows. /// </summary> /// <param name="workflows">The workflows.</param> public override void Save(IEnumerable <Workflow> workflows) { var coll = GetCollection(); var containers = workflows.Select(x => new WorkflowContainer(x)); foreach (Workflow wf in workflows) { WorkflowContainer wc = new WorkflowContainer(wf); coll.ReplaceOne(x => x.Id == wc.Id, wc, new UpdateOptions() { IsUpsert = true }); } }
/// <summary> /// Gets an active workflow by it's unique identifier, returning null if it does not exist. /// </summary> /// <param name="id"></param> /// <returns></returns> /// <exception cref="System.NotImplementedException"></exception> public override Workflow GetOrDefault(Guid id) { Workflow workflow = null; using (IDocumentSession session = this.OpenSession()) { WorkflowContainer wc = session.Load <WorkflowContainer>(id); if (wc != null) { workflow = wc.Workflow; } } return(workflow); }
public async Task <IActionResult> OnGetAsync(int?id) { if (!HttpContext.Session.Get <bool>("isadmin")) { return(NotFound()); } if (id == null) { return(NotFound()); } WorkflowContainer = await _context.Workflows.SingleOrDefaultAsync(m => m.DatabaseID == id); if (WorkflowContainer == null) { return(NotFound()); } return(Page()); }
protected WorkflowView CreateView(WorkflowContainer container) { var type = Type.GetType(container.Type); if (type == null) { return(null); } var view = new WorkflowView { DatabaseID = container.DatabaseID, Title = type.GetDisplayName(), Description = type.GetDescription(), State = container.State, Active = container.Active, Tag = container.Tag, Data = container.Data, NextExecution = DatetimeExtensions.FromUnixTime(container.NextExecution) }; return(view); }
protected override T DeserializeJsonWorkflow <T>(string json) { WorkflowContainer container = BsonSerializer.Deserialize <WorkflowContainer>(json); return((T)container.Workflow); }