protected virtual void Dispose(bool disposing) { if (disposing) { JobUtilExtensions.RunSync(async() => await StopInnerAsync(new CancellationToken())); } }
public static IServiceCollection AddCoreJobServer(this IServiceCollection services, IConfiguration configuration, Action <CoreJobServerOptions> action = null) { // options var options = new CoreJobServerOptions(); action?.Invoke(options); services.AddOptionConfiguration(configuration, options); services.AddSingleton(options); // ef core EntityFrameworkManager.IsCommunity = true; services.AddDbContext <JobDbContext>((provider, options) => { var storeOptions = provider.GetRequiredService <IOptions <StoreOptions> >().Value; provider.GetRequiredService <IStoreProvider>()?.OptionsAction(options, storeOptions); options.EnableSensitiveDataLogging().EnableDetailedErrors(); }); // quartz services.AddQuartz(q => { q.AddJobListener <CoreJobListener>(GroupMatcher <JobKey> .GroupEquals(JobConstant.Job_Default_Group)); q.AddTriggerListener <CoreJobListener>(GroupMatcher <TriggerKey> .GroupEquals(JobConstant.Job_Default_Group)); q.UseMicrosoftDependencyInjectionScopedJobFactory(); }); // services services.AddTransient <IServerSender, ServerSender>(); services.AddSingleton <IJobSchedulerHandler, JobSchedulerHandler>(); services.AddHostedService <JobSchedulerService>(); services.AddSingleton <ISystemScheduler, RegistryHealthCheckScheduler>(); // job if (!options.JobAssemblies.Contains(typeof(JobServerExtensions).Assembly)) { options.JobAssemblies.Add(typeof(JobServerExtensions).Assembly); } JobUtilExtensions.CollectByInterface <IJob>(options.JobAssemblies).ForEach(t => { services.AddScoped(t); }); // route table services.AddRouteTable(new ServerRouteTable()); // quartz server services.AddQuartzServer(options => { options.WaitForJobsToComplete = true; }); foreach (var item in options.Extensions) { item.AddServices(services); } return(services); }
private static void ScanDynamicJobExecutorHandler(this IServiceCollection services, ServiceLifetime lifetime) { // get all types var typesToRegisterAndAttr = JobUtilExtensions.CollectByAttributeTypes <CoreJobHandlerAttribute>() .Where(x => x.Item1.IsClass && !x.Item1.IsAbstract).ToList(); var types = typesToRegisterAndAttr.Select(x => { if (x.Item2.InterfaceType == null) { // get default var interfaces = x.Item1.GetInterfaces(); return(x.Item1, interfaces.FirstOrDefault()); } return(x.Item1, x.Item2.InterfaceType); }); var typesToRegisterList = types.GroupBy(x => x.Item2, y => y).ToDictionary(x => x.Key, y => y.ToList()); typesToRegisterAndAttr.ForEach(x => services.Add(new ServiceDescriptor(x.Item1, x.Item1, lifetime))); if (typesToRegisterList != null) { foreach (var typesToRegister in typesToRegisterList) { if (typesToRegister.Value != null) { services.AddScopedDynamicJobHandler(typesToRegister.Key, typesToRegister.Value.Select(x => x.Item1), lifetime); } } } }
private void ProcessQueuedItems(object ignored) { while (true) { JobMessage job; lock (_jobs) { if (_jobs.Count == 0) { _delegateQueuedOrRunning = false; break; } job = _jobs.Dequeue(); } JobUtilExtensions.RunSync(async() => { try { var properies = new Dictionary <string, object> { [JobConstant.LOGGER_SCOPE_JOBID_KEY] = job.Id, [JobConstant.LOGGER_SCOPE_JOBLOGID_KEY] = job.LogId, [JobConstant.LOGGER_SCOPE_JOBAREA_KEY] = JobConstant.LOGGER_SCOPE_JOBAREA_VALUE }; using (_logger.BeginScope(properies)) { var result = await _sender.Execute(job); job.CallBackCode = result.Code; if (result.Code == JobConstant.HTTP_FAIL_CODE) { _logger.LogError($"执行失败. Id:{job.Id}, Msg: {result.Msg}"); job.Reason = result.Msg; } else { job.Reason = result.Content; } } await _sender.CallBack(new List <JobMessage>() { job }); } catch (Exception ex) { var failedInfo = new FailedInfo() { ServiceProvider = _serviceProvider, Exception = ex, Job = job, Message = $"执行异常. Id:{job.Id}" }; _options?.FailedCallback?.Invoke(failedInfo); _logger.LogError(ex, failedInfo.Message); } }); } }