Экземпляр для JobExecutionContext с Quartz.NET и Autofac - PullRequest
0 голосов
/ 27 ноября 2018

Я ищу жизненный цикл при каждом выполнении кварцевого задания.Есть ли способ иметь жизненный цикл InstancePerJobExecutionContext с Quartz.NET и Autofac?

Вот фрагмент, который я уже использую:

public class AutofacJobFactory : IJobFactory {
    private readonly ILifetimeScope _container;
    private static readonly ConcurrentDictionary<IJob, ILifetimeScope>
        _childScopesMap = new ConcurrentDictionary<IJob, ILifetimeScope>();

    public AutofacJobFactory(ILifetimeScope container) {
        _container = container;
    }

    public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler) {
        var childScope = _container.BeginLifetimeScope();            
        var job = (IJob)childScope.Resolve(bundle.JobDetail.JobType);
        _childScopesMap.TryAdd(job, childScope);
        return job;
    }

    public void ReturnJob(IJob job) {
        if (!_childScopesMap.TryRemove(job, out var scope))
            return;
        try {
            scope.Dispose();
        } catch (Exception ex) {
            // TODO: handle/log 
        }
    }
}

Но я думаюЕсть ли лучший / эффективный / стабильный способ сделать это?

1 Ответ

0 голосов
/ 01 декабря 2018

Кажется, что использованный фрагмент работает нормально:

public class AutofacJobFactory : IJobFactory {
    private readonly ILifetimeScope _container;
    private static readonly ConcurrentDictionary<IJob, ILifetimeScope>
        _childScopesMap = new ConcurrentDictionary<IJob, ILifetimeScope>();

    public AutofacJobFactory(ILifetimeScope container) {
        _container = container;
    }

    public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler) {
        var childScope = _container.BeginLifetimeScope();            
        var job = (IJob)childScope.Resolve(bundle.JobDetail.JobType);
        _childScopesMap.TryAdd(job, childScope);
        return job;
    }

    public void ReturnJob(IJob job) {
        if (!_childScopesMap.TryRemove(job, out var scope))
            return;
        try {
            scope.Dispose();
        } catch (Exception ex) {
            // TODO: handle/log 
        }
    }
}
...