You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. using Quartz;
  2. using Quartz.Spi;
  3. namespace SecureSharing.Quartz;
  4. public sealed class JobsService : IHostedService
  5. {
  6. private readonly IJobFactory jobFactory;
  7. private readonly JobMetadata jobMetadata;
  8. private readonly ISchedulerFactory schedulerFactory;
  9. public JobsService(ISchedulerFactory
  10. schedulerFactory,
  11. JobMetadata jobMetadata,
  12. IJobFactory jobFactory)
  13. {
  14. this.schedulerFactory = schedulerFactory;
  15. this.jobMetadata = jobMetadata;
  16. this.jobFactory = jobFactory;
  17. }
  18. public IScheduler Scheduler { get; set; }
  19. public async Task StartAsync(CancellationToken cancellationToken)
  20. {
  21. Scheduler = await schedulerFactory.GetScheduler();
  22. Scheduler.JobFactory = jobFactory;
  23. var job = CreateJob(jobMetadata);
  24. var trigger = CreateTrigger(jobMetadata);
  25. await Scheduler.ScheduleJob(job, trigger, cancellationToken);
  26. await Scheduler.Start(cancellationToken);
  27. }
  28. public async Task StopAsync(CancellationToken cancellationToken)
  29. {
  30. await Scheduler?.Shutdown(cancellationToken);
  31. }
  32. private ITrigger CreateTrigger(JobMetadata jobMetadata)
  33. {
  34. return TriggerBuilder.Create()
  35. .WithIdentity(jobMetadata.JobId.ToString())
  36. .WithCronSchedule(jobMetadata.CronExpression)
  37. .WithDescription($"{jobMetadata.JobName}")
  38. .Build();
  39. }
  40. private IJobDetail CreateJob(JobMetadata jobMetadata)
  41. {
  42. return JobBuilder
  43. .Create(jobMetadata.JobType)
  44. .WithIdentity(jobMetadata.JobId.ToString())
  45. .WithDescription($"{jobMetadata.JobName}")
  46. .Build();
  47. }
  48. }