using Elsa.Activities.Scheduling.Jobs;
using Elsa.Modules.Quartz.Contracts;
using Elsa.Modules.Quartz.Jobs;
using Elsa.Modules.Quartz.Services;
using Elsa.Scheduling.Contracts;
using Microsoft.Extensions.DependencyInjection;
using Quartz;
using IElsaJob = Elsa.Scheduling.Contracts.IJob;
namespace Elsa.Modules.Quartz.Extensions;
public static class ServiceCollectionExtensions
{
///
/// This will register both Quartz as well as Elsa-specific services and jobs.
/// If you prefer to register Quartz yourself, use
///
public static IServiceCollection AddQuartzModule(
this IServiceCollection services,
Action? configureQuartzOptions = default,
Action? configureQuartz = default,
Action? configureQuartzHostedService = default)
{
if (configureQuartzOptions != null)
services.Configure(configureQuartzOptions);
return services
.AddQuartz(configure =>
{
ConfigureQuartz(configure, configureQuartz);
ConfigureQuartzModule(services, configure);
})
.AddQuartzHostedService(options => ConfigureQuartzHostedService(options, configureQuartzHostedService));
}
///
/// This will register Elsa-specific services and jobs, but will **not** register Quartz itself. To register Quartz, you need to do so yourself, or use to register & configure Quartz for Elsa.
///
public static IServiceCollection ConfigureQuartzModule(this IServiceCollection services, IServiceCollectionQuartzConfigurator quartz)
{
services
.AddSingleton()
.AddSingleton();
quartz.AddElsaJobs();
return services;
}
private static IServiceCollectionQuartzConfigurator AddElsaJobs(this IServiceCollectionQuartzConfigurator quartz)
{
quartz.AddJob();
return quartz;
}
private static void ConfigureQuartzHostedService(QuartzHostedServiceOptions options, Action? configureQuartzHostedService)
{
options.WaitForJobsToComplete = true;
configureQuartzHostedService?.Invoke(options);
}
private static IServiceCollectionQuartzConfigurator AddJob(this IServiceCollectionQuartzConfigurator quartz) where TJob : IElsaJob =>
quartz.AddJob>(job => job.StoreDurably().WithIdentity(nameof(RunWorkflowJob)));
private static void ConfigureQuartz(IServiceCollectionQuartzConfigurator quartz, Action? configureQuartz)
{
quartz.UseMicrosoftDependencyInjectionJobFactory();
quartz.AddJob>(job => job.StoreDurably().WithIdentity(nameof(RunWorkflowJob)));
quartz.UseSimpleTypeLoader();
quartz.UseInMemoryStore();
configureQuartz?.Invoke(quartz);
}
}