< Summary

Information
Class: Elsa.Workflows.Runtime.ShellFeatures.WorkflowRuntimeFeature
Assembly: Elsa.Workflows.Runtime
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Runtime/ShellFeatures/WorkflowRuntimeFeature.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 151
Coverable lines: 151
Total lines: 261
Line coverage: 0%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Runtime/ShellFeatures/WorkflowRuntimeFeature.cs

#LineLine coverage
 1using CShells.Features;
 2using Elsa.Common.RecurringTasks;
 3using Elsa.Extensions;
 4using Elsa.Mediator.Contracts;
 5using Elsa.Workflows.CommitStates;
 6using Elsa.Workflows.Management;
 7using Elsa.Workflows.Management.Contracts;
 8using Elsa.Workflows.Management.Services;
 9using Elsa.Workflows.Runtime.ActivationValidators;
 10using Elsa.Workflows.Runtime.Entities;
 11using Elsa.Workflows.Runtime.Handlers;
 12using Elsa.Workflows.Runtime.Options;
 13using Elsa.Workflows.Runtime.Providers;
 14using Elsa.Workflows.Runtime.Stores;
 15using Elsa.Workflows.Runtime.Tasks;
 16using Elsa.Workflows.Runtime.UIHints;
 17using Medallion.Threading;
 18using Medallion.Threading.FileSystem;
 19using Microsoft.Extensions.DependencyInjection;
 20
 21namespace Elsa.Workflows.Runtime.ShellFeatures;
 22
 23/// <summary>
 24/// Installs and configures workflow runtime features.
 25/// </summary>
 26[ShellFeature(
 27    DisplayName = "Workflow Runtime",
 28    Description = "Provides workflow execution runtime and scheduling capabilities",
 29    DependsOn = ["Workflows"])]
 30public class WorkflowRuntimeFeature : IShellFeature
 31{
 032    private IDictionary<string, DispatcherChannel> WorkflowDispatcherChannels { get; set; } = new Dictionary<string, Dis
 33
 34    /// <summary>
 35    /// A list of workflow builders configured during application startup.
 36    /// </summary>
 037    public IDictionary<string, Func<IServiceProvider, ValueTask<IWorkflow>>> Workflows { get; set; } = new Dictionary<st
 38
 39    /// <summary>
 40    /// A factory that instantiates a concrete <see cref="IWorkflowRuntime"/>.
 41    /// </summary>
 042    public Func<IServiceProvider, IWorkflowRuntime> WorkflowRuntime { get; set; } = sp => ActivatorUtilities.CreateInsta
 43
 44    /// <summary>
 45    /// A factory that instantiates an <see cref="IWorkflowDispatcher"/>.
 46    /// </summary>
 047    public Func<IServiceProvider, IWorkflowDispatcher> WorkflowDispatcher { get; set; } = sp =>
 048    {
 049        var decoratedService = ActivatorUtilities.CreateInstance<BackgroundWorkflowDispatcher>(sp);
 050        return ActivatorUtilities.CreateInstance<ValidatingWorkflowDispatcher>(sp, decoratedService);
 051    };
 52
 53    /// <summary>
 54    /// A factory that instantiates an <see cref="IStimulusDispatcher"/>.
 55    /// </summary>
 056    public Func<IServiceProvider, IStimulusDispatcher> StimulusDispatcher { get; set; } = sp => ActivatorUtilities.Creat
 57
 58    /// <summary>
 59    /// A factory that instantiates an <see cref="IWorkflowCancellationDispatcher"/>.
 60    /// </summary>
 061    public Func<IServiceProvider, IWorkflowCancellationDispatcher> WorkflowCancellationDispatcher { get; set; } = sp => 
 62
 63    /// <summary>
 64    /// A factory that instantiates an <see cref="IBookmarkStore"/>.
 65    /// </summary>
 066    public Func<IServiceProvider, IBookmarkStore> BookmarkStore { get; set; } = sp => sp.GetRequiredService<MemoryBookma
 67
 68    /// <summary>
 69    /// A factory that instantiates an <see cref="IBookmarkQueueStore"/>.
 70    /// </summary>
 071    public Func<IServiceProvider, IBookmarkQueueStore> BookmarkQueueStore { get; set; } = sp => sp.GetRequiredService<Me
 72
 73    /// <summary>
 74    /// A factory that instantiates an <see cref="ITriggerStore"/>.
 75    /// </summary>
 076    public Func<IServiceProvider, ITriggerStore> TriggerStore { get; set; } = sp => sp.GetRequiredService<MemoryTriggerS
 77
 78    /// <summary>
 79    /// A factory that instantiates an <see cref="IWorkflowExecutionLogStore"/>.
 80    /// </summary>
 081    public Func<IServiceProvider, IWorkflowExecutionLogStore> WorkflowExecutionLogStore { get; set; } = sp => sp.GetRequ
 82
 83    /// <summary>
 84    /// A factory that instantiates an <see cref="IActivityExecutionStore"/>.
 85    /// </summary>
 086    public Func<IServiceProvider, IActivityExecutionStore> ActivityExecutionLogStore { get; set; } = sp => sp.GetRequire
 87
 88    /// <summary>
 89    /// A factory that instantiates an <see cref="IDistributedLockProvider"/>.
 90    /// </summary>
 091    public Func<IServiceProvider, IDistributedLockProvider> DistributedLockProvider { get; set; } = _ => new FileDistrib
 92
 93    /// <summary>
 94    /// A factory that instantiates an <see cref="ITaskDispatcher"/>.
 95    /// </summary>
 096    public Func<IServiceProvider, ITaskDispatcher> RunTaskDispatcher { get; set; } = sp => sp.GetRequiredService<Backgro
 97
 98    /// <summary>
 99    /// A factory that instantiates an <see cref="IBackgroundActivityScheduler"/>.
 100    /// </summary>
 0101    public Func<IServiceProvider, IBackgroundActivityScheduler> BackgroundActivityScheduler { get; set; } = sp => Activa
 102
 103    /// <summary>
 104    /// A factory that instantiates a log record sink for an <see cref="ActivityExecutionRecord"/>.
 105    /// </summary>
 0106    public Func<IServiceProvider, ILogRecordSink<ActivityExecutionRecord>> ActivityExecutionLogSink { get; set; } = sp =
 107
 108    /// <summary>
 109    /// A factory that instantiates a log record sink for an <see cref="WorkflowExecutionLogRecord"/>.
 110    /// </summary>
 0111    public Func<IServiceProvider, ILogRecordSink<WorkflowExecutionLogRecord>> WorkflowExecutionLogSink { get; set; } = s
 112
 113    /// <summary>
 114    /// A factory that instantiates an <see cref="ICommandHandler"/>.
 115    /// </summary>
 0116    public Func<IServiceProvider, ICommandHandler> DispatchWorkflowCommandHandler { get; set; } = sp => sp.GetRequiredSe
 117
 118    /// <summary>
 119    /// A factory that instantiates an <see cref="IWorkflowResumer"/>.
 120    /// </summary>
 0121    public Func<IServiceProvider, IWorkflowResumer> WorkflowResumer { get; set; } = sp => sp.GetRequiredService<Workflow
 122
 123    /// <summary>
 124    /// A factory that instantiates an <see cref="IBookmarkQueueWorker"/>.
 125    /// </summary>
 0126    public Func<IServiceProvider, IBookmarkQueueWorker> BookmarkQueueWorker { get; set; } = sp => sp.GetRequiredService<
 127
 128
 129    public void ConfigureServices(IServiceCollection services)
 130    {
 131        // Options.
 0132        services.Configure<RuntimeOptions>(options => { options.Workflows = Workflows; });
 0133        services.Configure<WorkflowDispatcherOptions>(options =>
 0134        {
 0135            options.Channels.AddRange(WorkflowDispatcherChannels.Values);
 0136        });
 137
 0138        services
 0139            // Core.
 0140            .AddScoped<ITriggerIndexer, TriggerIndexer>()
 0141            .AddScoped<IWorkflowInstanceFactory, WorkflowInstanceFactory>()
 0142            .AddScoped<IWorkflowHostFactory, WorkflowHostFactory>()
 0143            .AddScoped<IBackgroundActivityInvoker, BackgroundActivityInvoker>()
 0144            .AddScoped(WorkflowRuntime)
 0145            .AddScoped(WorkflowDispatcher)
 0146            .AddScoped(StimulusDispatcher)
 0147            .AddScoped(WorkflowCancellationDispatcher)
 0148            .AddScoped(RunTaskDispatcher)
 0149            .AddScoped(ActivityExecutionLogSink)
 0150            .AddScoped(WorkflowExecutionLogSink)
 0151            .AddSingleton(BackgroundActivityScheduler)
 0152            .AddSingleton<RandomLongIdentityGenerator>()
 0153            .AddSingleton<IBookmarkQueueSignaler, BookmarkQueueSignaler>()
 0154            .AddScoped(BookmarkQueueWorker)
 0155            .AddScoped<IBookmarkManager, DefaultBookmarkManager>()
 0156            .AddScoped<IActivityExecutionManager, DefaultActivityExecutionManager>()
 0157            .AddScoped<IActivityExecutionStatsService, ActivityExecutionStatsService>()
 0158            .AddScoped<IActivityExecutionMapper, DefaultActivityExecutionMapper>()
 0159            .AddScoped<IWorkflowDefinitionStorePopulator, DefaultWorkflowDefinitionStorePopulator>()
 0160            .AddScoped<IRegistriesPopulator, DefaultRegistriesPopulator>()
 0161            .AddScoped<IWorkflowDefinitionsRefresher, WorkflowDefinitionsRefresher>()
 0162            .AddScoped<IWorkflowDefinitionsReloader, WorkflowDefinitionsReloader>()
 0163            .AddScoped<IWorkflowRegistry, DefaultWorkflowRegistry>()
 0164            .AddScoped<IWorkflowMatcher, WorkflowMatcher>()
 0165            .AddScoped<IWorkflowInvoker, WorkflowInvoker>()
 0166            .AddScoped<IStimulusSender, StimulusSender>()
 0167            .AddScoped<ITriggerBoundWorkflowService, TriggerBoundWorkflowService>()
 0168            .AddScoped<IBookmarkBoundWorkflowService, BookmarkBoundWorkflowService>()
 0169            .AddScoped<ITaskReporter, TaskReporter>()
 0170            .AddScoped<SynchronousTaskDispatcher>()
 0171            .AddScoped<BackgroundTaskDispatcher>()
 0172            .AddScoped<StoreActivityExecutionLogSink>()
 0173            .AddScoped<StoreWorkflowExecutionLogSink>()
 0174            .AddScoped<DispatchWorkflowCommandHandler>()
 0175            .AddScoped<IEventPublisher, EventPublisher>()
 0176            .AddScoped<IBookmarkUpdater, BookmarkUpdater>()
 0177            .AddScoped<IBookmarksPersister, BookmarksPersister>()
 0178            .AddScoped<IBookmarkResumer, BookmarkResumer>()
 0179            .AddScoped<IBookmarkQueue, StoreBookmarkQueue>()
 0180            .AddScoped<WorkflowResumer>()
 0181            .AddScoped<BookmarkQueueWorker>()
 0182            .AddScoped(WorkflowResumer)
 0183            .AddScoped<ITriggerInvoker, TriggerInvoker>()
 0184            .AddScoped<IWorkflowCanceler, WorkflowCanceler>()
 0185            .AddScoped<IWorkflowCancellationService, WorkflowCancellationService>()
 0186            .AddScoped<IWorkflowActivationStrategyEvaluator, DefaultWorkflowActivationStrategyEvaluator>()
 0187            .AddScoped<IWorkflowStarter, DefaultWorkflowStarter>()
 0188            .AddScoped<IWorkflowRestarter, DefaultWorkflowRestarter>()
 0189            .AddScoped<IBookmarkQueuePurger, DefaultBookmarkQueuePurger>()
 0190            .AddScoped<ILogRecordExtractor<WorkflowExecutionLogRecord>, WorkflowExecutionLogRecordExtractor>()
 0191            .AddScoped<IActivityPropertyLogPersistenceEvaluator, ActivityPropertyLogPersistenceEvaluator>()
 0192            .AddScoped<IBookmarkQueueProcessor, BookmarkQueueProcessor>()
 0193            .AddScoped<ICommitStateHandler, DefaultCommitStateHandler>()
 0194            .AddScoped<WorkflowHeartbeatGeneratorFactory>()
 0195
 0196            // Deprecated services.
 0197            .AddScoped<IWorkflowInbox, StimulusProxyWorkflowInbox>()
 0198
 0199            // Stores.
 0200            .AddScoped(BookmarkStore)
 0201            .AddScoped(BookmarkQueueStore)
 0202            .AddScoped(TriggerStore)
 0203            .AddScoped(WorkflowExecutionLogStore)
 0204            .AddScoped(ActivityExecutionLogStore)
 0205
 0206            // Lazy services.
 0207            .AddScoped<Func<IEnumerable<IWorkflowsProvider>>>(sp => sp.GetServices<IWorkflowsProvider>)
 0208            .AddScoped<Func<IEnumerable<IWorkflowMaterializer>>>(sp => sp.GetServices<IWorkflowMaterializer>)
 0209
 0210            // Noop stores.
 0211            .AddScoped<MemoryWorkflowExecutionLogStore>()
 0212            .AddScoped<MemoryActivityExecutionStore>()
 0213
 0214            // Memory stores.
 0215            .AddMemoryStore<StoredBookmark, MemoryBookmarkStore>()
 0216            .AddMemoryStore<StoredTrigger, MemoryTriggerStore>()
 0217            .AddMemoryStore<BookmarkQueueItem, MemoryBookmarkQueueStore>()
 0218            .AddMemoryStore<WorkflowExecutionLogRecord, MemoryWorkflowExecutionLogStore>()
 0219            .AddMemoryStore<ActivityExecutionRecord, MemoryActivityExecutionStore>()
 0220
 0221            // Startup tasks, background tasks, and recurring tasks.
 0222            .AddStartupTask<PopulateRegistriesStartupTask>()
 0223            .AddRecurringTask<TriggerBookmarkQueueRecurringTask>(TimeSpan.FromMinutes(1))
 0224            .AddRecurringTask<PurgeBookmarkQueueRecurringTask>(TimeSpan.FromSeconds(10))
 0225            .AddRecurringTask<RestartInterruptedWorkflowsTask>(TimeSpan.FromMinutes(5)) // Same default as the workflow 
 0226
 0227            // Distributed locking.
 0228            .AddSingleton(DistributedLockProvider)
 0229
 0230            // Workflow definition providers.
 0231            .AddWorkflowDefinitionProvider<ClrWorkflowsProvider>()
 0232
 0233            // UI property handlers.
 0234            .AddScoped<IPropertyUIHandler, DispatcherChannelOptionsProvider>()
 0235
 0236            // Domain handlers.
 0237            .AddCommandHandler<DispatchWorkflowCommandHandler>()
 0238            .AddCommandHandler<DispatchStimulusCommandHandler>()
 0239            .AddCommandHandler<CancelWorkflowsCommandHandler>()
 0240            .AddNotificationHandler<ResumeDispatchWorkflowActivity>()
 0241            .AddNotificationHandler<ResumeBulkDispatchWorkflowActivity>()
 0242            .AddNotificationHandler<ResumeExecuteWorkflowActivity>()
 0243            .AddNotificationHandler<IndexTriggers>()
 0244            .AddNotificationHandler<CancelBackgroundActivities>()
 0245            .AddNotificationHandler<DeleteBookmarks>()
 0246            .AddNotificationHandler<DeleteTriggers>()
 0247            .AddNotificationHandler<DeleteActivityExecutionLogRecords>()
 0248            .AddNotificationHandler<DeleteWorkflowExecutionLogRecords>()
 0249            .AddNotificationHandler<RefreshActivityRegistry>()
 0250            .AddNotificationHandler<SignalBookmarkQueueWorker>()
 0251            .AddNotificationHandler<EvaluateParentLogPersistenceModes>()
 0252            .AddNotificationHandler<CaptureActivityExecutionState>()
 0253            .AddNotificationHandler<ValidateWorkflowRequestHandler>()
 0254
 0255            // Workflow activation strategies.
 0256            .AddScoped<IWorkflowActivationStrategy, SingletonStrategy>()
 0257            .AddScoped<IWorkflowActivationStrategy, CorrelatedSingletonStrategy>()
 0258            .AddScoped<IWorkflowActivationStrategy, CorrelationStrategy>()
 0259            ;
 0260    }
 261}