From df43685307d0a0e2e05b44f47612518d038e0a24 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Tue, 25 Feb 2020 14:25:10 +0800 Subject: [PATCH] Release the scope instance in jobfactory --- .../Quartz/QuartzJobExecutionAdapter.cs | 6 +++--- .../Volo/Abp/Quartz/AbpQuartzJobFactory.cs | 18 ++++++++++++++++-- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs index 59a0223465..85a1ef736f 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs +++ b/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 : IJob, ITransientDependency + public class QuartzJobExecutionAdapter : IJob { protected AbpBackgroundJobOptions Options { get; } protected IServiceScopeFactory ServiceScopeFactory { get; } diff --git a/framework/src/Volo.Abp.Quartz/Volo/Abp/Quartz/AbpQuartzJobFactory.cs b/framework/src/Volo.Abp.Quartz/Volo/Abp/Quartz/AbpQuartzJobFactory.cs index 808ee06e94..428dbe03af 100644 --- a/framework/src/Volo.Abp.Quartz/Volo/Abp/Quartz/AbpQuartzJobFactory.cs +++ b/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 { + /// + /// Get the job from the dependency injection + /// public class AbpQuartzJobFactory : IJobFactory { private readonly IServiceProvider _serviceProvider; + private readonly ConcurrentDictionary _scopes = new ConcurrentDictionary(); + 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(); } } }