Skip to content

Commit cecf6d3

Browse files
committed
Defers tenant event handling for reliability
Ensures tenant events like module activation and workflow schedule creation are executed within a shell scope, improving reliability. Adds a startup task to populate registries asynchronously. Renames "Elsa" module to "Elsa Workflows" for clarity.
1 parent 398df4f commit cecf6d3

4 files changed

Lines changed: 34 additions & 17 deletions

File tree

‎src/modules/OrchardCore.Elsa.Timers/Common/CreateSchedules.cs‎

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using Elsa.Workflows.Runtime.Filters;
55
using JetBrains.Annotations;
66
using Microsoft.Extensions.DependencyInjection;
7+
using OrchardCore.Environment.Shell.Scope;
78
using OrchardCore.Modules;
89

910
namespace OrchardCore.Elsa.Timers.Common;
@@ -14,15 +15,19 @@ namespace OrchardCore.Elsa.Timers.Common;
1415
[UsedImplicitly]
1516
public class CreateSchedules(IServiceScopeFactory scopeFactory) : ModularTenantEvents
1617
{
17-
public override async Task ActivatedAsync()
18+
public override Task ActivatedAsync()
1819
{
19-
using var scope = scopeFactory.CreateScope();
20-
var serviceProvider = scope.ServiceProvider;
21-
var (triggers, bookmarks) = await GetTriggersAndBookmarksAsync(serviceProvider);
22-
var triggerScheduler = serviceProvider.GetRequiredService<ITriggerScheduler>();
23-
var bookmarkScheduler = serviceProvider.GetRequiredService<IBookmarkScheduler>();
24-
await triggerScheduler.ScheduleAsync(triggers);
25-
await bookmarkScheduler.ScheduleAsync(bookmarks);
20+
ShellScope.AddDeferredTask(async scope =>
21+
{
22+
using var serviceScope = scopeFactory.CreateScope();
23+
var serviceProvider = serviceScope.ServiceProvider;
24+
var (triggers, bookmarks) = await GetTriggersAndBookmarksAsync(serviceProvider);
25+
var triggerScheduler = serviceProvider.GetRequiredService<ITriggerScheduler>();
26+
var bookmarkScheduler = serviceProvider.GetRequiredService<IBookmarkScheduler>();
27+
await triggerScheduler.ScheduleAsync(triggers);
28+
await bookmarkScheduler.ScheduleAsync(bookmarks);
29+
});
30+
return Task.CompletedTask;
2631
}
2732

2833
public override async Task TerminatingAsync()

‎src/modules/OrchardCore.Elsa.Timers/Quartz/RegisterJobs.cs‎

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using Elsa.Scheduling.Quartz.Jobs;
33
using JetBrains.Annotations;
44
using Microsoft.Extensions.DependencyInjection;
5+
using OrchardCore.Environment.Shell.Scope;
56
using OrchardCore.Modules;
67
using Quartz;
78
using QuartzIScheduler = Quartz.IScheduler;
@@ -14,11 +15,15 @@ namespace OrchardCore.Elsa.Timers.Quartz;
1415
[UsedImplicitly]
1516
internal class RegisterJobs(ISchedulerFactory schedulerFactoryFactory, IServiceScopeFactory scopeFactory) : ModularTenantEvents
1617
{
17-
public override async Task ActivatingAsync()
18+
public override Task ActivatingAsync()
1819
{
19-
var scheduler = await schedulerFactoryFactory.GetScheduler();
20-
await CreateJobAsync<RunWorkflowJob>(scheduler);
21-
await CreateJobAsync<ResumeWorkflowJob>(scheduler);
20+
ShellScope.AddDeferredTask(async scope =>
21+
{
22+
var scheduler = await schedulerFactoryFactory.GetScheduler();
23+
await CreateJobAsync<RunWorkflowJob>(scheduler);
24+
await CreateJobAsync<ResumeWorkflowJob>(scheduler);
25+
});
26+
return Task.CompletedTask;
2227
}
2328

2429
private async Task CreateJobAsync<TJobType>(QuartzIScheduler scheduler, CancellationToken cancellationToken = default) where TJobType : IJob

‎src/modules/OrchardCore.Elsa/Manifest.cs‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010

1111
[assembly: Feature(
1212
Id = "OrchardCore.Elsa",
13-
Name = "Elsa",
14-
Description = "Provides foundational Elsa services.",
13+
Name = "Elsa Workflows",
14+
Description = "Provides foundational Elsa Workflows services.",
1515
Category = "Elsa",
1616
Dependencies = ["OrchardCore.Contents", OpenIdConstants.Features.Core]
1717
)]
Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
11
using Elsa.Workflows.Runtime;
2+
using Microsoft.Extensions.DependencyInjection;
3+
using OrchardCore.Environment.Shell.Scope;
24
using OrchardCore.Modules;
35

46
namespace OrchardCore.Elsa.StartupTasks;
57

6-
public class PopulateRegistriesTask(IRegistriesPopulator registriesPopulator) : ModularTenantEvents
8+
public class PopulateRegistriesTask : ModularTenantEvents
79
{
8-
public override async Task ActivatedAsync()
10+
public override Task ActivatedAsync()
911
{
10-
await registriesPopulator.PopulateAsync();
12+
ShellScope.AddDeferredTask(async scope =>
13+
{
14+
var registriesPopulator = scope.ServiceProvider.GetRequiredService<IRegistriesPopulator>();
15+
await registriesPopulator.PopulateAsync();
16+
});
17+
return Task.CompletedTask;
1118
}
1219
}

0 commit comments

Comments
 (0)