整体示意图:
1.DefaultThreadPool
如果不存在PropertyThreadPoolType,那么就使用DefaultThreadPool
var threadPoolTypeString = cfg.GetStringProperty(PropertyThreadPoolType).NullSafeTrim(); if (threadPoolTypeString != null && threadPoolTypeString.NullSafeTrim().StartsWith("Quartz.Simpl.SimpleThreadPool", StringComparison.OrdinalIgnoreCase)) { // default to use as synonym for now threadPoolTypeString = typeof(DefaultThreadPool).AssemblyQualifiedNameWithoutVersion(); } Type tpType = loadHelper.LoadType(threadPoolTypeString) ?? typeof(DefaultThreadPool); try { tp = ObjectUtils.InstantiateType<IThreadPool>(tpType); } catch (Exception e) { initException = new SchedulerException("ThreadPool type '{0}' could not be instantiated.".FormatInvariant(tpType), e); throw initException; } tProps = cfg.GetPropertyGroup(PropertyThreadPoolPrefix, true);
最终的执行都是要委托给线程池:默认10个工作线程[WorkThread]+一个调度线程[QuartzSchedulerThread]
QuartzSchedulerThread
QuartzSchedulerThread=> public async Task Run()
2.RAMJobStroe
如果不存在PropertyJobStoreType,那么就使用RAMJobStore
Type jsType = loadHelper.LoadType(cfg.GetStringProperty(PropertyJobStoreType)); try { js = ObjectUtils.InstantiateType<IJobStore>(jsType ?? typeof(RAMJobStore)); } catch (Exception e) { initException = new SchedulerException("JobStore of type '{0}' could not be instantiated.".FormatInvariant(jsType), e); throw initException; }
获取最近的trigger
private readonly SortedSet<TriggerWrapper> timeTriggers = new SortedSet<TriggerWrapper>(new TriggerWrapperComparator());
通过JobRunShell运行Job