diff --git a/src/apps/Elsa.Server.Web/Program.cs b/src/apps/Elsa.Server.Web/Program.cs index 81165a568c..b1427d8cd2 100644 --- a/src/apps/Elsa.Server.Web/Program.cs +++ b/src/apps/Elsa.Server.Web/Program.cs @@ -213,33 +213,6 @@ management.UseReadOnlyMode(useReadOnlyMode); management.AddVariableTypeAndAlias("Application"); }) - .UseProtoActor(proto => - { - proto - .EnableMetrics() - .EnableTracing(); - - proto.PersistenceProvider = _ => - { - if (sqlDatabaseProvider == SqlDatabaseProvider.SqlServer) - return new SqlServerProvider(sqlServerConnectionString!, true, "", "proto_actor"); - return new SqliteProvider(new SqliteConnectionStringBuilder(sqliteConnectionString)); - }; - - if (configuration["KUBERNETES_SERVICE_HOST"] != null) - { - var kubernetesConfig = new KubernetesProviderConfig(); - var clusterProvider = new KubernetesProvider(kubernetesConfig); - - var remoteConfig = GrpcNetRemoteConfig - .BindToAllInterfaces(advertisedHost: configuration["ProtoActor:AdvertisedHost"]) // Environment variable to be provided by Kubernetes using pod.status.podIP. - .WithLogLevelForDeserializationErrors(LogLevel.Critical) - .WithRemoteDiagnostics(true); - - proto.CreateClusterProvider = _ => clusterProvider; - proto.ConfigureRemoteConfig = _ => remoteConfig; - } - }) .UseWorkflowRuntime(runtime => { if (persistenceProvider == PersistenceProvider.MongoDb) @@ -457,6 +430,37 @@ }); } + if (distributedCachingTransport == DistributedCachingTransport.ProtoActor || workflowRuntime == WorkflowRuntime.ProtoActor) + { + elsa.UseProtoActor(proto => + { + proto + .EnableMetrics() + .EnableTracing(); + + proto.PersistenceProvider = _ => + { + if (sqlDatabaseProvider == SqlDatabaseProvider.SqlServer) + return new SqlServerProvider(sqlServerConnectionString!, true, "", "proto_actor"); + return new SqliteProvider(new SqliteConnectionStringBuilder(sqliteConnectionString)); + }; + + if (configuration["KUBERNETES_SERVICE_HOST"] != null) + { + var kubernetesConfig = new KubernetesProviderConfig(); + var clusterProvider = new KubernetesProvider(kubernetesConfig); + + var remoteConfig = GrpcNetRemoteConfig + .BindToAllInterfaces(advertisedHost: configuration["ProtoActor:AdvertisedHost"]) // Environment variable to be provided by Kubernetes using pod.status.podIP. + .WithLogLevelForDeserializationErrors(LogLevel.Critical) + .WithRemoteDiagnostics(true); + + proto.CreateClusterProvider = _ => clusterProvider; + proto.ConfigureRemoteConfig = _ => remoteConfig; + } + }); + } + if (useAzureServiceBus) { elsa.UseAzureServiceBus(azureServiceBusConnectionString, asb => diff --git a/test/component/Elsa.Workflows.ComponentTests/Helpers/Fixtures/WorkflowServer.cs b/test/component/Elsa.Workflows.ComponentTests/Helpers/Fixtures/WorkflowServer.cs index f589d82376..efeea9663a 100644 --- a/test/component/Elsa.Workflows.ComponentTests/Helpers/Fixtures/WorkflowServer.cs +++ b/test/component/Elsa.Workflows.ComponentTests/Helpers/Fixtures/WorkflowServer.cs @@ -77,6 +77,7 @@ protected override void ConfigureWebHost(IWebHostBuilder builder) elsa.UseMassTransit(massTransit => { //massTransit.UseRabbitMq(rabbitMqConnectionString); + massTransit.Services.AddSingleton(); massTransit.AddConsumer("elsa-test-workflow-definition-updates", true); }); elsa.UseIdentity(identity => identity.UseEntityFrameworkCore(ef => ef.UsePostgreSql(dbConnectionString))); @@ -122,8 +123,8 @@ protected override void ConfigureWebHost(IWebHostBuilder builder) { services .AddSingleton() - .AddSingleton() - .AddSingleton() + .AddScoped() + .AddScoped() .AddSingleton() .AddScoped() .AddNotificationHandlersFrom() diff --git a/test/component/Elsa.Workflows.ComponentTests/Scenarios/BulkDispatchWorkflows/BulkDispatchWorkflowsTests.cs b/test/component/Elsa.Workflows.ComponentTests/Scenarios/BulkDispatchWorkflows/BulkDispatchWorkflowsTests.cs index e279acaf29..008b5f5cf8 100644 --- a/test/component/Elsa.Workflows.ComponentTests/Scenarios/BulkDispatchWorkflows/BulkDispatchWorkflowsTests.cs +++ b/test/component/Elsa.Workflows.ComponentTests/Scenarios/BulkDispatchWorkflows/BulkDispatchWorkflowsTests.cs @@ -1,5 +1,4 @@ using Elsa.Common.Models; -using Elsa.Testing.Shared; using Elsa.Testing.Shared.Services; using Elsa.Workflows.ComponentTests.Abstractions; using Elsa.Workflows.ComponentTests.Fixtures; @@ -13,17 +12,13 @@ namespace Elsa.Workflows.ComponentTests.Scenarios.BulkDispatchWorkflows; public class BulkDispatchWorkflowsTests : AppComponentTest { - private readonly WorkflowEvents _workflowEvents; private readonly SignalManager _signalManager; private readonly IWorkflowRuntime _workflowRuntime; - private readonly object _greetEmployeesWorkflowCompletedSignal = new(); public BulkDispatchWorkflowsTests(App app) : base(app) { _workflowRuntime = Scope.ServiceProvider.GetRequiredService(); - _workflowEvents = Scope.ServiceProvider.GetRequiredService(); _signalManager = Scope.ServiceProvider.GetRequiredService(); - _workflowEvents.WorkflowInstanceSaved += OnWorkflowInstanceSaved; } /// @@ -38,9 +33,7 @@ await workflowClient.CreateInstanceAsync(new CreateWorkflowInstanceRequest WorkflowDefinitionHandle = WorkflowDefinitionHandle.ByDefinitionId(GreetEmployeesWorkflow.DefinitionId, VersionOptions.Published) }); await workflowClient.RunInstanceAsync(RunWorkflowInstanceRequest.Empty); - var parentWorkflowInstanceArgs = await _signalManager.WaitAsync(_greetEmployeesWorkflowCompletedSignal); - - Assert.Equal(WorkflowStatus.Finished, parentWorkflowInstanceArgs.WorkflowInstance.Status); + await _signalManager.WaitAsync("Completed"); } /// @@ -60,18 +53,4 @@ public async Task DispatchWorkflows_ChildWorkflowsShouldReceiveCurrentItem() await _signalManager.WaitAsync("Banana"); await _signalManager.WaitAsync("Cherry"); } - - private void OnWorkflowInstanceSaved(object? sender, WorkflowInstanceSavedEventArgs e) - { - if (e.WorkflowInstance.Status != WorkflowStatus.Finished) - return; - - if (e.WorkflowInstance.DefinitionId == GreetEmployeesWorkflow.DefinitionId) - _signalManager.Trigger(_greetEmployeesWorkflowCompletedSignal, e); - } - - protected override void OnDispose() - { - _workflowEvents.WorkflowInstanceSaved -= OnWorkflowInstanceSaved; - } } \ No newline at end of file diff --git a/test/component/Elsa.Workflows.ComponentTests/Scenarios/BulkDispatchWorkflows/Workflows/GreetEmployeesWorkflow.cs b/test/component/Elsa.Workflows.ComponentTests/Scenarios/BulkDispatchWorkflows/Workflows/GreetEmployeesWorkflow.cs index 9322f02e76..10602f28fb 100644 --- a/test/component/Elsa.Workflows.ComponentTests/Scenarios/BulkDispatchWorkflows/Workflows/GreetEmployeesWorkflow.cs +++ b/test/component/Elsa.Workflows.ComponentTests/Scenarios/BulkDispatchWorkflows/Workflows/GreetEmployeesWorkflow.cs @@ -1,3 +1,4 @@ +using Elsa.Testing.Shared.Activities; using Elsa.Workflows.Activities; namespace Elsa.Workflows.ComponentTests.Scenarios.BulkDispatchWorkflows.Workflows; @@ -28,7 +29,8 @@ protected override void Build(IWorkflowBuilder builder) WorkflowDefinitionId = new(EmployeeGreetingWorkflow.DefinitionId), Items = new(inputEntries), WaitForCompletion = new(true) - } + }, + new TriggerSignal("Completed") } }; }