protected virtual void Dispose(bool disposing)
 {
     if (disposing)
     {
         JobUtilExtensions.RunSync(async() => await StopInnerAsync(new CancellationToken()));
     }
 }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
                    }
                }
            }
        }
Ejemplo n.º 4
0
        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);
                    }
                });
            }
        }