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.

JobFactory.cs 1.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. using System.Collections.Concurrent;
  2. using Quartz;
  3. using Quartz.Spi;
  4. namespace SecureSharing.Quartz;
  5. public class JobFactory : IJobFactory
  6. {
  7. private readonly ConcurrentDictionary<IJob, IServiceScope> _scopes = new();
  8. private readonly IServiceProvider _serviceProvider;
  9. public JobFactory(IServiceProvider serviceProvider)
  10. {
  11. _serviceProvider = serviceProvider;
  12. }
  13. public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
  14. {
  15. var scope = _serviceProvider.CreateScope();
  16. IJob job;
  17. try
  18. {
  19. job = scope.ServiceProvider.GetRequiredService(bundle.JobDetail.JobType) as IJob;
  20. }
  21. catch
  22. {
  23. // Failed to create the job -> ensure scope gets disposed
  24. scope.Dispose();
  25. throw;
  26. }
  27. // Add scope to dictionary so we can dispose it once the job finishes
  28. if (!_scopes.TryAdd(job, scope))
  29. {
  30. // Failed to track DI scope -> ensure scope gets disposed
  31. scope.Dispose();
  32. throw new Exception("Failed to track DI scope");
  33. }
  34. return job;
  35. }
  36. public void ReturnJob(IJob job)
  37. {
  38. if (_scopes.TryRemove(job, out var scope))
  39. // The Dispose() method ends the scope lifetime.
  40. // Once Dispose is called, any scoped services that have been resolved from ServiceProvider will be disposed.
  41. scope.Dispose();
  42. }
  43. }