From 7d7e893a62f4613eb5a3018f985e49850dc73605 Mon Sep 17 00:00:00 2001 From: herblinernexxbizz <125579511+herblinernexxbizz@users.noreply.github.com> Date: Wed, 8 Mar 2023 21:43:02 +0100 Subject: [PATCH] V3 update routetable on startup (#3780) * add triggering all indexes to route table * create hostedservice to run population of routetable --- .../Contracts/ITriggerIndexer.cs | 5 ++++ .../Features/WorkflowRuntimeFeature.cs | 3 +- .../HostedServices/PopulateRouteTable.cs | 29 +++++++++++++++++++ .../Services/TriggerIndexer.cs | 21 ++++++++++++++ 4 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 src/modules/Elsa.Workflows.Runtime/HostedServices/PopulateRouteTable.cs diff --git a/src/modules/Elsa.Workflows.Runtime/Contracts/ITriggerIndexer.cs b/src/modules/Elsa.Workflows.Runtime/Contracts/ITriggerIndexer.cs index 5869c882a..93a590b53 100644 --- a/src/modules/Elsa.Workflows.Runtime/Contracts/ITriggerIndexer.cs +++ b/src/modules/Elsa.Workflows.Runtime/Contracts/ITriggerIndexer.cs @@ -20,4 +20,9 @@ public interface ITriggerIndexer /// Indexes triggers of the specified workflow. /// Task IndexTriggersAsync(Workflow workflow, CancellationToken cancellationToken = default); + + /// + /// Send message of all triggers in the trigger store to populate the routetable on startup + /// + Task IndexAllTriggersAsync(CancellationToken cancellationToken = default); } \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Runtime/Features/WorkflowRuntimeFeature.cs b/src/modules/Elsa.Workflows.Runtime/Features/WorkflowRuntimeFeature.cs index b23c4324a..60d9533a7 100644 --- a/src/modules/Elsa.Workflows.Runtime/Features/WorkflowRuntimeFeature.cs +++ b/src/modules/Elsa.Workflows.Runtime/Features/WorkflowRuntimeFeature.cs @@ -109,7 +109,8 @@ public class WorkflowRuntimeFeature : FeatureBase Module .ConfigureHostedService() .ConfigureHostedService() - .ConfigureHostedService(); + .ConfigureHostedService() + .ConfigureHostedService(); /// public override void Apply() diff --git a/src/modules/Elsa.Workflows.Runtime/HostedServices/PopulateRouteTable.cs b/src/modules/Elsa.Workflows.Runtime/HostedServices/PopulateRouteTable.cs new file mode 100644 index 000000000..65b788e20 --- /dev/null +++ b/src/modules/Elsa.Workflows.Runtime/HostedServices/PopulateRouteTable.cs @@ -0,0 +1,29 @@ +using Elsa.Workflows.Runtime.Contracts; +using Microsoft.Extensions.Hosting; + +namespace Elsa.Workflows.Runtime.HostedServices; + +/// +/// Synchronously updates the routetable from the triggers. +/// +public class PopulateRouteTable : IHostedService +{ + private readonly ITriggerIndexer _triggerIndexer; + + /// + /// Constructor. + /// + public PopulateRouteTable(ITriggerIndexer triggerIndexer) + { + _triggerIndexer = triggerIndexer; + } + + /// + public async Task StartAsync(CancellationToken cancellationToken) + { + await _triggerIndexer.IndexAllTriggersAsync(cancellationToken); + } + + /// + public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask; +} \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Runtime/Services/TriggerIndexer.cs b/src/modules/Elsa.Workflows.Runtime/Services/TriggerIndexer.cs index ff4ebe08d..1aefe2e19 100644 --- a/src/modules/Elsa.Workflows.Runtime/Services/TriggerIndexer.cs +++ b/src/modules/Elsa.Workflows.Runtime/Services/TriggerIndexer.cs @@ -67,6 +67,27 @@ public class TriggerIndexer : ITriggerIndexer return await IndexTriggersAsync(workflow, cancellationToken); } + + /// + public async Task IndexAllTriggersAsync(CancellationToken cancellationToken = default) + { + var emptyTriggerList = new List(0); + + // Get current triggers + var filter = new TriggerFilter(); + var allTriggersTriggers = await _triggerStore.FindManyAsync(filter, cancellationToken); + + + //workflow definition already deleted so you do not have one + var workflow = new Workflow(); + + var indexedWorkflow = new IndexedWorkflowTriggers(workflow, allTriggersTriggers.ToList(), emptyTriggerList, emptyTriggerList); + + // Publish event. + await _eventPublisher.PublishAsync(new WorkflowTriggersIndexed(indexedWorkflow), cancellationToken); + return indexedWorkflow; + } + /// public async Task IndexTriggersAsync(Workflow workflow, CancellationToken cancellationToken = default) {