Exemplo n.º 1
0
 public AppTenantsInitializer(
     AppTenantsContext context,
     IConfiguration configuration,
     IHostingEnvironment environment,
     IApplicationLifetime applicationLifetime,
     IJobFilterProvider jobFilters,
     MultitenantContainer multiTenantContainer,
     IBackgroundJobFactory backgroundJobFactory,
     IBackgroundJobPerformer backgroundJobPerformer,
     IBackgroundJobStateChanger backgroundJobStateChanger,
     IBackgroundProcess[] additionalProcesses,
     ITenantConfiguration[] tenantConfigurations)
 {
     _context                   = context;
     _configuration             = configuration;
     _environment               = environment;
     _applicationLifetime       = applicationLifetime;
     _jobFilters                = jobFilters;
     _multiTenantContainer      = multiTenantContainer;
     _backgroundJobFactory      = backgroundJobFactory;
     _backgroundJobPerformer    = backgroundJobPerformer;
     _backgroundJobStateChanger = backgroundJobStateChanger;
     _additionalProcesses       = additionalProcesses;
     _tenantConfigurations      = tenantConfigurations;
 }
Exemplo n.º 2
0
        public static (BackgroundJobServer server, IRecurringJobManager recurringJobManager, IBackgroundJobClient backgroundJobClient) StartHangfireServer(
            string serverName,
            string connectionString,
            IApplicationLifetime applicationLifetime,
            IJobFilterProvider jobFilters,
            JobActivator jobActivator,
            IBackgroundJobFactory backgroundJobFactory,
            IBackgroundJobPerformer backgroundJobPerformer,
            IBackgroundJobStateChanger backgroundJobStateChanger,
            IBackgroundProcess[] additionalProcesses
            )
        {
            var options = new BackgroundJobServerOptions
            {
                ServerName = serverName,
                Queues     = new string[] { serverName, "default" }
            };

            return(StartHangfireServer(
                       options,
                       connectionString,
                       applicationLifetime,
                       jobFilters,
                       jobActivator,
                       backgroundJobFactory,
                       backgroundJobPerformer,
                       backgroundJobStateChanger,
                       additionalProcesses
                       ));
        }
Exemplo n.º 3
0
        internal Worker(
            [NotNull] IEnumerable <string> queues,
            [NotNull] IBackgroundJobPerformer performer,
            [NotNull] IBackgroundJobStateChanger stateChanger,
            TimeSpan jobInitializationTimeout,
            int maxStateChangeAttempts)
        {
            if (queues == null)
            {
                throw new ArgumentNullException(nameof(queues));
            }
            if (performer == null)
            {
                throw new ArgumentNullException(nameof(performer));
            }
            if (stateChanger == null)
            {
                throw new ArgumentNullException(nameof(stateChanger));
            }

            _queues       = queues.ToArray();
            _performer    = performer;
            _stateChanger = stateChanger;

            _jobInitializationWaitTimeout = jobInitializationTimeout;
            _maxStateChangeAttempts       = maxStateChangeAttempts;

            _profiler = new SlowLogProfiler(_logger);
        }
Exemplo n.º 4
0
        public Worker(
            [NotNull] IEnumerable <string> queues,
            [NotNull] IBackgroundJobPerformer performer,
            [NotNull] IBackgroundJobStateChanger stateChanger,
            [NotNull] JobActivator activator)
        {
            if (queues == null)
            {
                throw new ArgumentNullException(nameof(queues));
            }
            if (performer == null)
            {
                throw new ArgumentNullException(nameof(performer));
            }
            if (stateChanger == null)
            {
                throw new ArgumentNullException(nameof(stateChanger));
            }
            if (activator == null)
            {
                throw new ArgumentNullException(nameof(activator));
            }

            _queues       = queues.ToArray();
            _performer    = performer;
            _stateChanger = stateChanger;
            _activator    = activator;
            _workerId     = Guid.NewGuid().ToString();
            _profiler     = new SlowLogProfiler(_logger);
        }
Exemplo n.º 5
0
 public Worker(
     [NotNull] IEnumerable <string> queues,
     [NotNull] IBackgroundJobPerformer performer,
     [NotNull] IBackgroundJobStateChanger stateChanger)
     : this(queues, performer, stateChanger, JobActivator.Current)
 {
 }
        public static (BackgroundJobServer server, IRecurringJobManager recurringJobManager, IBackgroundJobClient backgroundJobClient) StartHangfireServer(
            string tenantId,
            string serverName,
            string connectionString,
            IApplicationLifetime applicationLifetime,
            IJobFilterProvider jobFilters,
            MultitenantContainer mtc,
            IBackgroundJobFactory backgroundJobFactory,
            IBackgroundJobPerformer backgroundJobPerformer,
            IBackgroundJobStateChanger backgroundJobStateChanger,
            IBackgroundProcess[] additionalProcesses
            )
        {
            var tenantJobActivator = new AspNetCoreMultiTenantJobActivator(mtc, tenantId);

            return(HangfireHelper.StartHangfireServer(
                       serverName,
                       connectionString,
                       applicationLifetime,
                       jobFilters,
                       tenantJobActivator,
                       backgroundJobFactory,
                       backgroundJobPerformer,
                       backgroundJobStateChanger,
                       additionalProcesses));
        }
Exemplo n.º 7
0
 public Worker(
     [NotNull] IEnumerable <string> queues,
     [NotNull] IBackgroundJobPerformer performer,
     [NotNull] IBackgroundJobStateChanger stateChanger)
     : this(queues, performer, stateChanger, jobInitializationTimeout : TimeSpan.FromMinutes(1), maxStateChangeAttempts : 10)
 {
 }
Exemplo n.º 8
0
        internal BackgroundJobPerformer(
            [NotNull] IJobFilterProvider filterProvider, 
            [NotNull] IBackgroundJobPerformer innerPerformer)
        {
            if (filterProvider == null) throw new ArgumentNullException(nameof(filterProvider));
            if (innerPerformer == null) throw new ArgumentNullException(nameof(innerPerformer));

            _filterProvider = filterProvider;
            _innerPerformer = innerPerformer;
        }
Exemplo n.º 9
0
 public WorkerProcess(string[] queues, IBackgroundJobPerformer performer, DataStorage storage, string serverId, TimeSpan workerFetchIdleSleep)
 {
     this._workerId             = Guid.NewGuid().ToString();
     this._serverId             = serverId ?? throw new ArgumentNullException(nameof(serverId));
     this._queues               = queues ?? throw new ArgumentNullException(nameof(queues));
     this._performer            = performer ?? throw new ArgumentNullException(nameof(performer));
     this._storage              = storage ?? throw new ArgumentNullException(nameof(storage));
     this._eventManager         = new EventManager(this._storage.GetMonitoringApi());
     this._workerFetchIdleSleep = workerFetchIdleSleep;
     RegisterWorker();
 }
Exemplo n.º 10
0
        public BackgroundJobServer(
            [NotNull] BackgroundJobServerOptions options,
            [NotNull] JobStorage storage,
            [NotNull] IEnumerable <IBackgroundProcess> additionalProcesses,
            [CanBeNull] IJobFilterProvider filterProvider,
            [CanBeNull] JobActivator activator,
            [CanBeNull] IBackgroundJobFactory factory,
            [CanBeNull] IBackgroundJobPerformer performer,
            [CanBeNull] IBackgroundJobStateChanger stateChanger)
        {
            if (storage == null)
            {
                throw new ArgumentNullException(nameof(storage));
            }
            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }
            if (additionalProcesses == null)
            {
                throw new ArgumentNullException(nameof(additionalProcesses));
            }

            _options = options;

            var processes = new List <IBackgroundProcessDispatcherBuilder>();

            processes.AddRange(GetRequiredProcesses(filterProvider, activator, factory, performer, stateChanger));
            processes.AddRange(additionalProcesses.Select(x => x.UseBackgroundPool(1)));

            var properties = new Dictionary <string, object>
            {
                { "Queues", options.Queues },
                { "WorkerCount", options.WorkerCount }
            };

            _logger.Info($"Starting Hangfire Server using job storage: '{storage}'");

            storage.WriteOptionsToLog(_logger);

            _logger.Info("Using the following options for Hangfire Server:\r\n" +
                         $"    Worker count: {options.WorkerCount}\r\n" +
                         $"    Listening queues: {String.Join(", ", options.Queues.Select(x => "'" + x + "'"))}\r\n" +
                         $"    Shutdown timeout: {options.ShutdownTimeout}\r\n" +
                         $"    Schedule polling interval: {options.SchedulePollingInterval}");

            _processingServer = new BackgroundProcessingServer(
                storage,
                processes,
                properties,
                GetProcessingServerOptions());
        }
Exemplo n.º 11
0
 public Worker(
     [NotNull] IEnumerable<string> queues,
     [NotNull] IBackgroundJobPerformer performer, 
     [NotNull] IBackgroundJobStateChanger stateChanger)
 {
     if (queues == null) throw new ArgumentNullException("queues");
     if (performer == null) throw new ArgumentNullException("performer");
     if (stateChanger == null) throw new ArgumentNullException("stateChanger");
     
     _queues = queues.ToArray();
     _performer = performer;
     _stateChanger = stateChanger;
     _workerId = Guid.NewGuid().ToString();
 }
Exemplo n.º 12
0
        internal BackgroundJobPerformer(
            [NotNull] IJobFilterProvider filterProvider,
            [NotNull] IBackgroundJobPerformer innerPerformer)
        {
            if (filterProvider == null)
            {
                throw new ArgumentNullException(nameof(filterProvider));
            }
            if (innerPerformer == null)
            {
                throw new ArgumentNullException(nameof(innerPerformer));
            }

            _filterProvider = filterProvider;
            _innerPerformer = innerPerformer;
        }
        public BackgroundJobServerHostedService(
            [NotNull] JobStorage storage,
            [NotNull] BackgroundJobServerOptions options,
            [NotNull] IEnumerable <IBackgroundProcess> additionalProcesses,
            [CanBeNull] IBackgroundJobFactory factory,
            [CanBeNull] IBackgroundJobPerformer performer,
            [CanBeNull] IBackgroundJobStateChanger stateChanger)
        {
            _options = options ?? throw new ArgumentNullException(nameof(options));
            _storage = storage ?? throw new ArgumentNullException(nameof(storage));

            _additionalProcesses = additionalProcesses;

            _factory      = factory;
            _performer    = performer;
            _stateChanger = stateChanger;
        }
Exemplo n.º 14
0
        public static (BackgroundJobServer server, IRecurringJobManager recurringJobManager, IBackgroundJobClient backgroundJobClient) StartHangfireServer(
            BackgroundJobServerOptions options,
            string connectionString,
            IApplicationLifetime applicationLifetime,
            IJobFilterProvider jobFilters,
            JobActivator jobActivator,
            IBackgroundJobFactory backgroundJobFactory,
            IBackgroundJobPerformer backgroundJobPerformer,
            IBackgroundJobStateChanger backgroundJobStateChanger,
            IBackgroundProcess[] additionalProcesses
            )
        {
            JobStorage storage;

            if (string.IsNullOrWhiteSpace(connectionString))
            {
                storage = new MemoryStorage();
            }
            else if (ConnectionStringHelper.IsSQLite(connectionString))
            {
                storage = new SQLiteStorage(connectionString);
            }
            else
            {
                storage = new SqlServerStorage(connectionString);
            }

            var server = new BackgroundJobServer(options, storage, additionalProcesses,
                                                 options.FilterProvider ?? jobFilters,
                                                 options.Activator ?? jobActivator,
                                                 backgroundJobFactory,
                                                 backgroundJobPerformer,
                                                 backgroundJobStateChanger);

            applicationLifetime.ApplicationStopping.Register(() => server.SendStop());
            applicationLifetime.ApplicationStopped.Register(() => server.Dispose());

            var recurringJobManager = new RecurringJobManager(storage, backgroundJobFactory);

            var backgroundJobClient = new BackgroundJobClient(storage, backgroundJobFactory, backgroundJobStateChanger);

            return(server, recurringJobManager, backgroundJobClient);
        }
Exemplo n.º 15
0
        private IEnumerable <IBackgroundProcessDispatcherBuilder> GetRequiredProcesses(
            [CanBeNull] IJobFilterProvider filterProvider,
            [CanBeNull] JobActivator activator,
            [CanBeNull] IBackgroundJobFactory factory,
            [CanBeNull] IBackgroundJobPerformer performer,
            [CanBeNull] IBackgroundJobStateChanger stateChanger)
        {
            var processes        = new List <IBackgroundProcessDispatcherBuilder>();
            var timeZoneResolver = _options.TimeZoneResolver ?? new DefaultTimeZoneResolver();

            if (factory == null && performer == null && stateChanger == null)
            {
                filterProvider = filterProvider ?? _options.FilterProvider ?? JobFilterProviders.Providers;
                activator      = activator ?? _options.Activator ?? JobActivator.Current;

                factory      = new BackgroundJobFactory(filterProvider);
                performer    = new BackgroundJobPerformer(filterProvider, activator, _options.TaskScheduler);
                stateChanger = new BackgroundJobStateChanger(filterProvider);
            }
            else
            {
                if (factory == null)
                {
                    throw new ArgumentNullException(nameof(factory));
                }
                if (performer == null)
                {
                    throw new ArgumentNullException(nameof(performer));
                }
                if (stateChanger == null)
                {
                    throw new ArgumentNullException(nameof(stateChanger));
                }
            }

            processes.Add(new Worker(_options.Queues, performer, stateChanger).UseBackgroundPool(_options.WorkerCount));
            processes.Add(new DelayedJobScheduler(_options.SchedulePollingInterval, stateChanger).UseBackgroundPool(1));
            processes.Add(new RecurringJobScheduler(factory, _options.SchedulePollingInterval, timeZoneResolver).UseBackgroundPool(1));

            return(processes);
        }
        internal static bool GetInternalServices(
            IServiceProvider provider,
            out IBackgroundJobFactory factory,
            out IBackgroundJobStateChanger stateChanger,
            out IBackgroundJobPerformer performer)
        {
            factory      = provider.GetService <IBackgroundJobFactory>();
            performer    = provider.GetService <IBackgroundJobPerformer>();
            stateChanger = provider.GetService <IBackgroundJobStateChanger>();

            if (factory != null && performer != null && stateChanger != null)
            {
                return(true);
            }

            factory      = null;
            performer    = null;
            stateChanger = null;

            return(false);
        }
Exemplo n.º 17
0
        public HangfireServer(
            BackgroundJobServerOptions options,
            JobStorage jobStorage,
            IEnumerable <IBackgroundProcess> backgroundProcesses,
            IBackgroundJobFactory jobFactory,
            IBackgroundJobPerformer jobPerformer,
            IBackgroundJobStateChanger jobStateChanger,
            ILogger <HangfireServer> logger,
            IJobFilterProvider jobFilterProvider = default,
            JobActivator activator = default
            )
        {
            _options             = options;
            _jobStorage          = jobStorage;
            _backgroundProcesses = backgroundProcesses;
            _jobFactory          = jobFactory;
            _jobPerformer        = jobPerformer;
            _jobStateChanger     = jobStateChanger;
            _jobFilterProvider   = options.FilterProvider ?? jobFilterProvider;
            _activator           = options.Activator ?? activator;

            _logger = logger;
        }
Exemplo n.º 18
0
        private IEnumerable <IBackgroundProcess> GetRequiredProcesses(
            [NotNull] IJobFilterProvider filterProvider,
            [NotNull] JobActivator activator,
            [CanBeNull] IBackgroundJobFactory factory,
            [CanBeNull] IBackgroundJobPerformer performer,
            [CanBeNull] IBackgroundJobStateChanger stateChanger)
        {
            var processes = new List <IBackgroundProcess>();

            factory      = factory ?? new BackgroundJobFactory(filterProvider);
            performer    = performer ?? new BackgroundJobPerformer(filterProvider, activator);
            stateChanger = stateChanger ?? new BackgroundJobStateChanger(filterProvider);

            for (var i = 0; i < _options.WorkerCount; i++)
            {
                processes.Add(new Worker(_options.Queues, performer, stateChanger));
            }

            processes.Add(new DelayedJobScheduler(_options.SchedulePollingInterval, stateChanger));
            processes.Add(new RecurringJobScheduler(factory));

            return(processes);
        }
Exemplo n.º 19
0
        public Worker(
            [NotNull] IEnumerable <string> queues,
            [NotNull] IBackgroundJobPerformer performer,
            [NotNull] IBackgroundJobStateChanger stateChanger)
        {
            if (queues == null)
            {
                throw new ArgumentNullException("queues");
            }
            if (performer == null)
            {
                throw new ArgumentNullException("performer");
            }
            if (stateChanger == null)
            {
                throw new ArgumentNullException("stateChanger");
            }

            _queues       = queues.ToArray();
            _performer    = performer;
            _stateChanger = stateChanger;
            _workerId     = Guid.NewGuid().ToString();
        }
 public ApplicationInsightsBackgroundJobPerformer([NotNull] IBackgroundJobPerformer inner,
                                                  TelemetryClient telemetryClient)
 {
     _inner           = inner ?? throw new ArgumentNullException(nameof(inner));
     _telemetryClient = telemetryClient;
 }
Exemplo n.º 21
0
 public CustomBackgroundJobPerformer([NotNull] IBackgroundJobPerformer inner)
 {
     _inner = inner ?? throw new ArgumentNullException(nameof(inner));
 }