Browse Source

Release the scope instance in jobfactory

pull/2904/head
liangshiwei 7 years ago
parent
commit
df43685307
  1. 6
      framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs
  2. 18
      framework/src/Volo.Abp.Quartz/Volo/Abp/Quartz/AbpQuartzJobFactory.cs

6
framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs

@ -1,12 +1,12 @@
using System.Threading.Tasks;
using System;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Quartz;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.BackgroundJobs.Quartz
{
public class QuartzJobExecutionAdapter<TArgs> : IJob, ITransientDependency
public class QuartzJobExecutionAdapter<TArgs> : IJob
{
protected AbpBackgroundJobOptions Options { get; }
protected IServiceScopeFactory ServiceScopeFactory { get; }

18
framework/src/Volo.Abp.Quartz/Volo/Abp/Quartz/AbpQuartzJobFactory.cs

@ -1,14 +1,20 @@
using System;
using System.Collections.Concurrent;
using Microsoft.Extensions.DependencyInjection;
using Quartz;
using Quartz.Spi;
namespace Volo.Abp.Quartz
{
/// <summary>
/// Get the job from the dependency injection
/// </summary>
public class AbpQuartzJobFactory : IJobFactory
{
private readonly IServiceProvider _serviceProvider;
private readonly ConcurrentDictionary<IJob, IServiceScope> _scopes = new ConcurrentDictionary<IJob, IServiceScope>();
public AbpQuartzJobFactory(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
@ -16,12 +22,20 @@ namespace Volo.Abp.Quartz
public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
{
return _serviceProvider.GetRequiredService(bundle.JobDetail.JobType) as IJob;
var scope = _serviceProvider.CreateScope();
var job = scope.ServiceProvider.GetRequiredService(bundle.JobDetail.JobType) as IJob;
if (job == null)
{
throw new ArgumentException("Given job does not implement IJob");
}
_scopes.TryAdd(job, scope);
return job;
}
public void ReturnJob(IJob job)
{
(job as IDisposable)?.Dispose();
_scopes.TryRemove(job, out var serviceScope);
serviceScope?.Dispose();
}
}
}

Loading…
Cancel
Save