コード例 #1
0
        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);
                }
            }
        }
コード例 #2
0
ファイル: WQL.cs プロジェクト: fabiohvp/WorQLess.Net
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
 /// <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();
     }
 }
コード例 #5
0
 /// <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();
     }
 }
コード例 #6
0
 public WorkflowContext()
 {
     Container = new WorkflowContainer
     {
         Type  = GetType().AssemblyQualifiedName,
         State = WorkflowStatusType.New.ToString()
     };
     Logs = new List <WorkflowLog>();
 }
コード例 #7
0
        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);
        }
コード例 #8
0
        /// <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
            });
        }
コード例 #9
0
        /// <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);
        }
コード例 #10
0
        /// <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();
            }
        }
コード例 #11
0
        /// <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
                });
            }
        }
コード例 #12
0
        /// <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);
        }
コード例 #13
0
        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());
        }
コード例 #14
0
        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);
        }
コード例 #15
0
        protected override T DeserializeJsonWorkflow <T>(string json)
        {
            WorkflowContainer container = BsonSerializer.Deserialize <WorkflowContainer>(json);

            return((T)container.Workflow);
        }