diff --git a/src/bundles/Elsa.ServerAndStudio.Web/Program.cs b/src/bundles/Elsa.ServerAndStudio.Web/Program.cs index 819515346..9950789e4 100644 --- a/src/bundles/Elsa.ServerAndStudio.Web/Program.cs +++ b/src/bundles/Elsa.ServerAndStudio.Web/Program.cs @@ -59,7 +59,12 @@ services .UseWorkflowRuntime(runtime => { runtime.UseEntityFrameworkCore(ef => ef.UseSqlite(sqliteConnectionString)); - runtime.UseMassTransitDispatcher(); + + if (useMassTransit) + { + runtime.UseMassTransitDispatcher(); + } + if (useProtoActor) { runtime.UseProtoActor(proto => proto.PersistenceProvider = _ => diff --git a/src/modules/Elsa.MassTransit/Consumers/WorkflowDefinitionEventsConsumer.cs b/src/modules/Elsa.MassTransit/Consumers/WorkflowDefinitionEventsConsumer.cs index 2a2eba5cd..75bbb73e1 100644 --- a/src/modules/Elsa.MassTransit/Consumers/WorkflowDefinitionEventsConsumer.cs +++ b/src/modules/Elsa.MassTransit/Consumers/WorkflowDefinitionEventsConsumer.cs @@ -26,7 +26,10 @@ public class WorkflowDefinitionEventsConsumer(IActivityRegistryPopulator activit public Task Consume(ConsumeContext context) => RefreshAsync(); /// - public Task Consume(ConsumeContext context) => RefreshAsync(); + public async Task Consume(ConsumeContext context) + { + await activityRegistryPopulator.AddToRegistry(typeof(WorkflowDefinitionActivityProvider), context.Message.Id); + } /// public Task Consume(ConsumeContext context) => RefreshAsync(); diff --git a/src/modules/Elsa.Workflows.Management/Contracts/IActivityRegistryPopulator.cs b/src/modules/Elsa.Workflows.Management/Contracts/IActivityRegistryPopulator.cs index 93e3d6bd7..5988d72b1 100644 --- a/src/modules/Elsa.Workflows.Management/Contracts/IActivityRegistryPopulator.cs +++ b/src/modules/Elsa.Workflows.Management/Contracts/IActivityRegistryPopulator.cs @@ -19,4 +19,12 @@ public interface IActivityRegistryPopulator /// The type of the provider. /// The cancellation token. Task PopulateRegistryAsync(Type providerType, CancellationToken cancellationToken = default); + + /// + /// Tries to add a workflow as an activity to the registry. + /// + /// The type of the activity provider. + /// The ID of the workflow definition. + /// The cancellation token. + Task AddToRegistry(Type providerType, string workflowDefinitionId, CancellationToken cancellationToken = default); } \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Management/Handlers/RefreshActivityRegistryHandler.cs b/src/modules/Elsa.Workflows.Management/Handlers/RefreshActivityRegistryHandler.cs index 538ae40ff..6e613acb2 100644 --- a/src/modules/Elsa.Workflows.Management/Handlers/RefreshActivityRegistryHandler.cs +++ b/src/modules/Elsa.Workflows.Management/Handlers/RefreshActivityRegistryHandler.cs @@ -22,7 +22,10 @@ public class RefreshActivityRegistryHandler(IActivityRegistryPopulator activityR INotificationHandler { /// - public async Task HandleAsync(WorkflowDefinitionPublished notification, CancellationToken cancellationToken) => await RefreshAsync(cancellationToken); + public async Task HandleAsync(WorkflowDefinitionPublished notification, CancellationToken cancellationToken) + { + await activityRegistryPopulator.AddToRegistry(typeof(WorkflowDefinitionActivityProvider), notification.WorkflowDefinition.Id); + } /// public async Task HandleAsync(WorkflowDefinitionRetracted notification, CancellationToken cancellationToken) => await RefreshAsync(cancellationToken); diff --git a/src/modules/Elsa.Workflows.Management/Services/ActivityRegistryPopulator.cs b/src/modules/Elsa.Workflows.Management/Services/ActivityRegistryPopulator.cs index 7445179fc..acbf4f924 100644 --- a/src/modules/Elsa.Workflows.Management/Services/ActivityRegistryPopulator.cs +++ b/src/modules/Elsa.Workflows.Management/Services/ActivityRegistryPopulator.cs @@ -37,6 +37,18 @@ public class ActivityRegistryPopulator : IActivityRegistryPopulator await PopulateRegistryAsync(provider, cancellationToken); } + /// + public async Task AddToRegistry(Type providerType, string workflowDefinitionVersionId, CancellationToken cancellationToken = default) + { + var provider = _providers.First(x => x.GetType() == providerType); + var descriptors = await provider.GetDescriptorsAsync(cancellationToken); + var descriptorToAdd = descriptors + .SingleOrDefault(d => d.CustomProperties.TryGetValue("WorkflowDefinitionVersionId", out var val) && val.ToString() == workflowDefinitionVersionId); + + if (descriptorToAdd is not null) + _registry.Add(providerType, descriptorToAdd!); + } + private async Task PopulateRegistryAsync(IActivityProvider provider, CancellationToken cancellationToken = default) { var descriptors = await provider.GetDescriptorsAsync(cancellationToken);