Beispiel #1
0
 public virtual HttpResponseMessage DeleteById(string documentId)
 {
     _dataRepository.IdDelete(documentId);
     return(new HttpResponseMessage(HttpStatusCode.NoContent));
 }
Beispiel #2
0
        private void RunAgent()
        {
            var autoSleepTimeout = DateTime.UtcNow + _initialSleepTimeout;

            var instanceTriggersQuery = new QuerySpecification
            {
                BookMark = new GenericPageBookmark {
                    PageSize = 1000
                },
                Where = new Filter
                {
                    Rules = new Comparison[]
                    {
                        new Comparison
                        {
                            Data  = Id,
                            Field = "InstanceTarget",
                            Test  = Test.Equal
                        }
                    }
                }
            };

            while (_runAgent && !_ct.IsCancellationRequested)
            {
                try
                {
                    // scan triggers
                    IEnumerable <WorkflowTrigger> instTrigs = Enumerable.Empty <WorkflowTrigger>();
                    instanceTriggersQuery.BookMark = new GenericPageBookmark(new GenericPageBookmark {
                        PageSize = 1000
                    });
                    do
                    {
                        var qr = _triggers.Query(instanceTriggersQuery);
                        if (qr.Items.Any())
                        {
                            instTrigs = instTrigs.Concat(qr.Items);
                        }
                        instanceTriggersQuery.BookMark = qr.Bookmark;
                    } while (instanceTriggersQuery.BookMark.More);

                    var myTrigs = instTrigs.ToArray().GroupBy(t => t.Route);

                    _ct.ThrowIfCancellationRequested();

                    if (myTrigs.Any())
                    {
                        var fireTrigs = myTrigs.Where(t => t.Key == TriggerRoutes.FireRoute);
                        foreach (var t in fireTrigs.SelectMany())
                        {
                            try
                            {
                                StateMachines[t.MachineContext].Fire(t.TriggerName);
                            }
                            catch (Exception ex)
                            {
                                _log.Error(ex.TraceInformation());
                            }

                            _triggers.IdDelete(t.Id);



                            _ct.ThrowIfCancellationRequested();
                        }

                        var completeTrigs = myTrigs.Where(t => t.Key == TriggerRoutes.EndRoute);
                        if (completeTrigs.Any())
                        {
                            CompleteWorkflow();

                            _triggers.DeleteBatch(myTrigs.SelectMany().ToList());



                            break;
                        }
                        else
                        {
                            var napTrigs = myTrigs.Where(t => t.Key == TriggerRoutes.NapRoute);
                            if (napTrigs.Any())
                            {
                                _triggers.DeleteBatch(napTrigs.SelectMany().ToList());



                                if (StateMachines.Values.Any(sm => sm.CanActivate))
                                {
                                    // TODO: nap time variable
                                    var nextActivationTime = DateTime.UtcNow + TimeSpan.FromMinutes(60.0);

                                    Sleep(nextActivationTime);
                                }
                                else
                                {
                                    // no activation triggers, so this sleep would be until triggered
                                    Sleep();
                                }

                                break;
                            }
                        }

                        autoSleepTimeout = DateTime.UtcNow + _autoSleepTime;
                    }

                    _bumpEvent.Wait(TimeSpan.FromMinutes(5.0));
                    _bumpEvent.Reset();


                    // auto sleep?
                    if (DateTime.UtcNow > autoSleepTimeout)
                    {
                        //Sleep();
                    }
                }
                catch (OperationCanceledException)
                {
                }
                catch (Exception ex)
                {
                    var es = string.Format("Workflow agent exception: {0}", ex);
                    _log.Error(es);
                    var on = Catalog.Factory.Resolve <IApplicationAlert>();
                    on.RaiseAlert(ApplicationAlertKind.System, es);
                }
            }
        }