quartznet / quartznet

Quartz Enterprise Scheduler .NET
http://www.quartz-scheduler.net/
Apache License 2.0
6.52k stars 1.69k forks source link

3.2.1 Broken scoped services #998

Closed sergeyshaykhullin closed 3 years ago

sergeyshaykhullin commented 3 years ago

Describe the bug

In 3.2.0 you have MicrosoftDependencyInjectionScopedJobFactory it creates scope first and resolve dependency from scope In 3.2.1 you trying to resolve scoped service from root provider

Now it works like you try to inject scoped service into Startup.Configure without creating scope

Version used

3.2.1

To Reproduce

Add any scoped job to DI and try to fire it

Expected behavior

If CreateScope is true - create scope first

Additional context

An error occurred instantiating job to be executed. job= 'Template.RequestSendingJob, message=Cannot resolve scoped service 'AppAny.Template.Service.RequestSendingJob' from root provider.' Quartz.SchedulerException: Problem instantiating type 'AppAny.Template.Service.RequestSendingJob: Cannot resolve scoped serv ice 'AppAny.Template.Service.RequestSendingJob' from root provider.' ---> System.InvalidOperationException: Cannot resolve scoped service 'AppAny.Template.Service.RequestSendingJob' from root provider. at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(Type serviceType, IService Scope scope, IServiceScope rootScope) at Microsoft.Extensions.DependencyInjection.ServiceProvider.Microsoft.Extensions.DependencyInjection.ServiceLookup.IServi ceProviderEngineCallback.OnResolve(Type serviceType, IServiceScope scope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProvi derEngineScope serviceProviderEngineScope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType) at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider , Type serviceType) at Quartz.Simpl.MicrosoftDependencyInjectionJobFactory.InstantiateJob(TriggerFiredBundle bundle, IScheduler scheduler) at Quartz.Simpl.PropertySettingJobFactory.NewJob(TriggerFiredBundle bundle, IScheduler scheduler) at MassTransit.QuartzIntegration.MassTransitJobFactory.NewJob(TriggerFiredBundle bundle, IScheduler scheduler) at Quartz.Core.JobRunShell.Initialize(QuartzScheduler sched, CancellationToken cancellationToken) --- End of inner exception stack trace --- [See nested exception: System.InvalidOperationException: Cannot resolve scoped service 'AppAny.Template.Service.RequestSendingJob' from root provider. at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(Type serviceType, IService Scope scope, IServiceScope rootScope) at Microsoft.Extensions.DependencyInjection.ServiceProvider.Microsoft.Extensions.DependencyInjection.ServiceLookup.IServi ceProviderEngineCallback.OnResolve(Type serviceType, IServiceScope scope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProvi derEngineScope serviceProviderEngineScope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType) at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider , Type serviceType) at Quartz.Simpl.MicrosoftDependencyInjectionJobFactory.InstantiateJob(TriggerFiredBundle bundle, IScheduler scheduler) at Quartz.Simpl.PropertySettingJobFactory.NewJob(TriggerFiredBundle bundle, IScheduler scheduler) at MassTransit.QuartzIntegration.MassTransitJobFactory.NewJob(TriggerFiredBundle bundle, IScheduler scheduler) at Quartz.Core.JobRunShell.Initialize(QuartzScheduler sched, CancellationToken cancellationToken)]

lahma commented 3 years ago

Thanks for reporting and providing the fix. I'll push 3.2.2 soon out.

dittodhole commented 3 years ago

3.2.1 and 3.2.2 break Autofac.Extras.Quartz/4.6.0. Resolving seems to not work anymore.

Quartz.JobPersistenceException: The job (DEFAULT.XXX) referenced by the trigger does not exist.
   bei Quartz.Simpl.RAMJobStore.StoreTriggerInternal(IOperableTrigger newTrigger, Boolean replaceExisting)
   bei Quartz.Simpl.RAMJobStore.StoreTrigger(IOperableTrigger newTrigger, Boolean replaceExisting, CancellationToken cancellationToken)
   bei Quartz.Core.QuartzScheduler.<ScheduleJob>d__83.MoveNext()
<?xml version="1.0" encoding="utf-8"?>
<job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData"
                     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                     version="2.0">
  <schedule>
    <job>
      <name>XXX</name>
      <group>DEFAULT</group>
      <job-type>XXX, ASSEMBLY</job-type>
      <durable>true</durable>
      <recover>false</recover>
    </job>
  </schedule>
</job-scheduling-data>