Exemplo n.º 1
0
        public WorkflowExecutorFixture()
        {
            Host = A.Fake <IWorkflowHost>();
            PersistenceProvider   = A.Fake <IPersistenceProvider>();
            ServiceProvider       = A.Fake <IServiceProvider>();
            ScopeProvider         = A.Fake <IScopeProvider>();
            Registry              = A.Fake <IWorkflowRegistry>();
            ResultProcesser       = A.Fake <IExecutionResultProcessor>();
            EventHub              = A.Fake <ILifeCycleEventPublisher>();
            CancellationProcessor = A.Fake <ICancellationProcessor>();
            DateTimeProvider      = A.Fake <IDateTimeProvider>();

            Options = new WorkflowOptions(A.Fake <IServiceCollection>());

            var scope = A.Fake <IServiceScope>();

            A.CallTo(() => ScopeProvider.CreateScope(A <IStepExecutionContext> ._)).Returns(scope);
            A.CallTo(() => scope.ServiceProvider).Returns(ServiceProvider);

            A.CallTo(() => DateTimeProvider.Now).Returns(DateTime.Now);
            A.CallTo(() => DateTimeProvider.UtcNow).Returns(DateTime.UtcNow);

            //config logging
            var loggerFactory = new LoggerFactory();

            //loggerFactory.AddConsole(LogLevel.Debug);

            Subject = new WorkflowExecutor(Registry, ServiceProvider, ScopeProvider, DateTimeProvider, ResultProcesser, EventHub, CancellationProcessor, Options, loggerFactory);
        }
Exemplo n.º 2
0
        public WorkflowExecutorFixture()
        {
            //setup dependency injection
            IServiceCollection services = new ServiceCollection();

            services.AddLogging();

            //TODO: mock these dependencies to make true unit tests
            Options = new WorkflowOptions();
            services.AddSingleton(Options);
            services.AddTransient <IWorkflowBuilder, WorkflowBuilder>();
            services.AddTransient <IWorkflowRegistry, WorkflowRegistry>();
            services.AddTransient <IExecutionResultProcessor, ExecutionResultProcessor>();
            services.AddTransient <IExecutionPointerFactory, ExecutionPointerFactory>();
            services.AddTransient <IDateTimeProvider, DateTimeProvider>();

            Host = A.Fake <IWorkflowHost>();
            PersistenceProvider = A.Fake <IPersistenceProvider>();
            var serviceProvider = services.BuildServiceProvider();

            //config logging
            var loggerFactory = serviceProvider.GetService <ILoggerFactory>();

            loggerFactory.AddConsole(LogLevel.Debug);

            Registry        = serviceProvider.GetService <IWorkflowRegistry>();
            ResultProcesser = serviceProvider.GetService <IExecutionResultProcessor>();

            Subject = new WorkflowExecutor(Registry, serviceProvider, new DateTimeProvider(), ResultProcesser, Options, loggerFactory);
        }
Exemplo n.º 3
0
        public WorkflowExecutorFixture()
        {
            Host = A.Fake <IWorkflowHost>();
            PersistenceProvider   = A.Fake <IPersistenceProvider>();
            ServiceProvider       = A.Fake <IServiceProvider>();
            ScopeProvider         = A.Fake <IScopeProvider>();
            Registry              = A.Fake <IWorkflowRegistry>();
            ResultProcesser       = A.Fake <IExecutionResultProcessor>();
            EventHub              = A.Fake <ILifeCycleEventPublisher>();
            CancellationProcessor = A.Fake <ICancellationProcessor>();
            DateTimeProvider      = A.Fake <IDateTimeProvider>();
            MiddlewareRunner      = A.Fake <IWorkflowMiddlewareRunner>();
            StepExecutor          = A.Fake <IStepExecutor>();

            Options = new WorkflowOptions(A.Fake <IServiceCollection>());

            var stepExecutionScope = A.Fake <IServiceScope>();

            A.CallTo(() => ScopeProvider.CreateScope(A <IStepExecutionContext> ._)).Returns(stepExecutionScope);
            A.CallTo(() => stepExecutionScope.ServiceProvider).Returns(ServiceProvider);

            var scope        = A.Fake <IServiceScope>();
            var scopeFactory = A.Fake <IServiceScopeFactory>();

            A.CallTo(() => ServiceProvider.GetService(typeof(IServiceScopeFactory))).Returns(scopeFactory);
            A.CallTo(() => scopeFactory.CreateScope()).Returns(scope);
            A.CallTo(() => scope.ServiceProvider).Returns(ServiceProvider);

            A.CallTo(() => DateTimeProvider.Now).Returns(DateTime.Now);
            A.CallTo(() => DateTimeProvider.UtcNow).Returns(DateTime.UtcNow);

            A
            .CallTo(() => ServiceProvider.GetService(typeof(IWorkflowMiddlewareRunner)))
            .Returns(MiddlewareRunner);

            A
            .CallTo(() => ServiceProvider.GetService(typeof(IStepExecutor)))
            .Returns(StepExecutor);

            A.CallTo(() => MiddlewareRunner
                     .RunPostMiddleware(A <WorkflowInstance> ._, A <WorkflowDefinition> ._))
            .Returns(Task.CompletedTask);

            A.CallTo(() => MiddlewareRunner
                     .RunExecuteMiddleware(A <WorkflowInstance> ._, A <WorkflowDefinition> ._))
            .Returns(Task.CompletedTask);

            A.CallTo(() => StepExecutor.ExecuteStep(A <IStepExecutionContext> ._, A <IStepBody> ._))
            .ReturnsLazily(call =>
                           call.Arguments[1].As <IStepBody>().RunAsync(
                               call.Arguments[0].As <IStepExecutionContext>()));

            //config logging
            var loggerFactory = new LoggerFactory();

            //loggerFactory.AddConsole(LogLevel.Debug);

            Subject = new WorkflowExecutor(Registry, ServiceProvider, ScopeProvider, DateTimeProvider, ResultProcesser, EventHub, CancellationProcessor, Options, loggerFactory);
        }
Exemplo n.º 4
0
        /// <summary>
        /// Worker thread body
        /// </summary>
        private void RunWorkflows()
        {
            IWorkflowExecutor    workflowExecutor = _serviceProvider.GetService <IWorkflowExecutor>();
            IPersistenceProvider persistenceStore = _serviceProvider.GetService <IPersistenceProvider>();

            while (!_shutdown)
            {
                try
                {
                    var workflowId = QueueProvider.DequeueForProcessing().Result;
                    if (workflowId != null)
                    {
                        try
                        {
                            if (LockProvider.AcquireLock(workflowId).Result)
                            {
                                WorkflowInstance workflow = null;
                                try
                                {
                                    workflow = persistenceStore.GetWorkflowInstance(workflowId).Result;
                                    if (workflow.Status == WorkflowStatus.Runnable)
                                    {
                                        workflowExecutor.Execute(workflow, persistenceStore, Options);
                                    }
                                }
                                finally
                                {
                                    LockProvider.ReleaseLock(workflowId).Wait();
                                    if (workflow != null)
                                    {
                                        if ((workflow.Status == WorkflowStatus.Runnable) && workflow.NextExecution.HasValue && workflow.NextExecution.Value < DateTime.Now.ToUniversalTime().Ticks)
                                        {
                                            QueueProvider.QueueForProcessing(workflowId);
                                        }
                                    }
                                }
                            }
                            else
                            {
                                Logger.LogInformation("Workflow locked {0}", workflowId);
                            }
                        }
                        catch (Exception ex)
                        {
                            Logger.LogError(ex.Message);
                        }
                    }
                    else
                    {
                        Thread.Sleep(Options.IdleTime); //no work
                    }
                }
                catch (Exception ex)
                {
                    Logger.LogError(ex.Message);
                }
            }
        }
Exemplo n.º 5
0
 public WorkflowConsumer(IPersistenceProvider persistenceProvider, IQueueProvider queueProvider, ILoggerFactory loggerFactory, IServiceProvider serviceProvider, IWorkflowRegistry registry, IDistributedLockProvider lockProvider, IWorkflowExecutor executor, IDateTimeProvider datetimeProvider, IGreyList greylist, WorkflowOptions options)
     : base(queueProvider, loggerFactory, options)
 {
     _persistenceStore = persistenceProvider;
     _greylist         = greylist;
     _executor         = executor;
     _lockProvider     = lockProvider;
     _datetimeProvider = datetimeProvider;
 }
Exemplo n.º 6
0
 public SyncWorkflowRunner(IWorkflowHost host, IWorkflowExecutor executor, IDistributedLockProvider lockService, IWorkflowRegistry registry, IPersistenceProvider persistenceStore, IExecutionPointerFactory pointerFactory, IQueueProvider queueService)
 {
     _host             = host;
     _executor         = executor;
     _lockService      = lockService;
     _registry         = registry;
     _persistenceStore = persistenceStore;
     _pointerFactory   = pointerFactory;
     _queueService     = queueService;
 }
Exemplo n.º 7
0
 public WorkflowThread(IPersistenceProvider persistenceStore, IQueueProvider queueProvider, ILoggerFactory loggerFactory, IServiceProvider serviceProvider, IWorkflowRegistry registry, IDistributedLockProvider lockProvider, IWorkflowExecutor executor, WorkflowOptions options)
 {
     _persistenceStore = persistenceStore;
     _queueProvider    = queueProvider;
     _executor         = executor;
     _options          = options;
     _logger           = loggerFactory.CreateLogger <WorkflowThread>();
     _lockProvider     = lockProvider;
     _thread           = new Thread(RunWorkflows);
     persistenceStore.EnsureStoreExists();
 }
        public WorkflowExecutorFixture()
        {
            Host = A.Fake <IWorkflowHost>();
            PersistenceProvider = A.Fake <IPersistenceProvider>();
            ServiceProvider     = A.Fake <IServiceProvider>();
            Registry            = A.Fake <IWorkflowRegistry>();
            ResultProcesser     = A.Fake <IExecutionResultProcessor>();
            DateTimeProvider    = A.Fake <IClockProvider>();

            Options = new WorkflowOptions();

            A.CallTo(() => DateTimeProvider.Now).Returns(DateTime.Now);

            //config logging
            var loggerFactory = new LoggerFactory();

            Subject = new WorkflowExecutor(Registry, ServiceProvider, ResultProcesser, Options, loggerFactory);
        }
Exemplo n.º 9
0
        public WorkflowExecutorFixture()
        {
            Host = A.Fake <IWorkflowHost>();
            PersistenceProvider = A.Fake <IPersistenceProvider>();
            ServiceProvider     = A.Fake <IServiceProvider>();
            Registry            = A.Fake <IWorkflowRegistry>();
            ResultProcesser     = A.Fake <IExecutionResultProcessor>();
            DateTimeProvider    = A.Fake <IDateTimeProvider>();

            Options = new WorkflowOptions(A.Fake <IServiceCollection>());

            A.CallTo(() => DateTimeProvider.Now).Returns(DateTime.Now);

            //config logging
            var loggerFactory = new LoggerFactory();

            loggerFactory.AddConsole(LogLevel.Debug);

            Subject = new WorkflowExecutor(Registry, ServiceProvider, DateTimeProvider, ResultProcesser, Options, loggerFactory, PersistenceProvider);
        }
Exemplo n.º 10
0
        public WorkflowExecutorFixture()
        {
            //setup dependency injection
            IServiceCollection services = new ServiceCollection();

            services.AddLogging();

            Options = new WorkflowOptions();
            services.AddTransient <IWorkflowBuilder, WorkflowBuilder>();
            services.AddTransient <IWorkflowRegistry, WorkflowRegistry>();

            Host = A.Fake <IWorkflowHost>();
            PersistenceProvider = A.Fake <IPersistenceProvider>();
            var serviceProvider = services.BuildServiceProvider();

            //config logging
            var loggerFactory = serviceProvider.GetService <ILoggerFactory>();

            loggerFactory.AddConsole(LogLevel.Debug);

            Registry = serviceProvider.GetService <IWorkflowRegistry>();

            Subject = new WorkflowExecutor(Registry, serviceProvider, new DateTimeProvider(), loggerFactory);
        }
Exemplo n.º 11
0
 public RequestExecuteJob(IRepository <Request> requestRepository, IWorkflowExecutor workflowExecutor)
 {
     _requestRepository = requestRepository;
     _workflowExecutor  = workflowExecutor;
 }