Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

JobFactory.cs 1.5KB

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