private IEnumerable <IBackgroundProcess> GetRequiredProcesses()
        {
            var processes = new List <IBackgroundProcess>();

            var filterProvider = _options.FilterProvider ?? JobFilterProviders.Providers;

            var factory      = new BackgroundJobFactory(filterProvider);
            var performer    = new BackgroundJobPerformer(filterProvider, _options.Activator ?? JobActivator.Current);
            var 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);
        }
Ejemplo n.º 2
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);
        }
Ejemplo n.º 3
0
        private IEnumerable <IBackgroundProcessDispatcherBuilder> GetRequiredProcesses()
        {
            var processes        = new List <IBackgroundProcessDispatcherBuilder>();
            var timeZoneResolver = _options.TimeZoneResolver ?? new DefaultTimeZoneResolver();

            var filterProvider = _options.FilterProvider ?? JobFilterProviders.Providers;
            var activator      = _options.Activator ?? JobActivator.Current;

            var factory      = new BackgroundJobFactory(filterProvider);
            var performer    = new BackgroundJobPerformer(filterProvider, activator, _options.TaskScheduler);
            var stateChanger = new BackgroundJobStateChanger(filterProvider);

            var gate = new Gate(1, _options.WorkerCount);

            processes.Add(new GateTuner(gate, _options.Queues, TimeSpan.FromSeconds(5)).UseBackgroundPool(1));
            processes.Add(new GateWorker(gate, 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);
        }
Ejemplo n.º 4
0
        public static (BackgroundJobServer server, IRecurringJobManager recurringJobManager, IBackgroundJobClient backgroundJobClient) StartHangfireServer(BackgroundJobServerOptions options, string connectionString)
        {
            JobStorage storage;

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

            var filterProvider = JobFilterProviders.Providers;
            var activator      = JobActivator.Current;

            var backgroundJobFactory      = new BackgroundJobFactory(filterProvider);
            var performer                 = new BackgroundJobPerformer(filterProvider, activator);
            var backgroundJobStateChanger = new BackgroundJobStateChanger(filterProvider);
            IEnumerable <IBackgroundProcess> additionalProcesses = null;

            var server = new BackgroundJobServer(options, storage, additionalProcesses,
                                                 options.FilterProvider ?? filterProvider,
                                                 options.Activator ?? activator,
                                                 backgroundJobFactory,
                                                 performer,
                                                 backgroundJobStateChanger);

            var recurringJobManager = new RecurringJobManager(storage, backgroundJobFactory);

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

            return(server, recurringJobManager, backgroundJobClient);
        }
Ejemplo n.º 5
0
        SetupHangfire(
            Action <ContainerBuilder> configureContainer = null,
            Action <Mock <Crawler>, Mock <IGrainFactory> > configureCrawlerMock = null,
            Action <Mock <ICrawlerStrategy> > configureStrategyMock             = null)
        {
            var jobStorage = new MemoryStorage(
                new MemoryStorageOptions
            {
                FetchNextJobTimeout = TimeSpan.FromMilliseconds(200)
            });
            var containerBuilder = new ContainerBuilder();
            var stateChanger     = new BackgroundJobStateChanger(JobFilterProviders.Providers);
            var jobFactory       = new BackgroundJobFactory(JobFilterProviders.Providers);
            var jobClient        = new BackgroundJobClient(
                jobStorage,
                jobFactory,
                stateChanger);

            var strategy = new Mock <ICrawlerStrategy>();

            if (configureStrategyMock != null)
            {
                configureStrategyMock(strategy);
            }
            else
            {
                strategy.Setup(s => s.ProcessRequestAsync(
                                   It.IsAny <CrawlRequestBase>(),
                                   It.IsAny <CancellationToken>()))
                .Returns(Task.CompletedTask)
                .Verifiable();
            }

            var strategyFactory = new Mock <ICrawlerStrategyFactory>();

            strategyFactory.Setup(f => f.Create(
                                      It.IsAny <CrawlRequestBase>()))
            .Returns(() => strategy.Object);

            var grainFactoryMock = new Mock <IGrainFactory>();

            grainFactoryMock.Setup(gf => gf.GetGrain <IProcessCrawlRequests>(
                                       It.IsAny <string>(),
                                       It.IsAny <string>()))
            .Returns <string, string>((grainId, _) => createCrawler(grainId));

            Crawler createCrawler(string id)
            {
                var logger      = Mock.Of <ILogger <Crawler> >();
                var crawlerMock = new Mock <Crawler>(
                    MockBehavior.Loose,
                    jobClient,
                    logger,
                    new Lazy <ICrawlerStrategyFactory>(strategyFactory.Object));

                if (configureCrawlerMock != null)
                {
                    configureCrawlerMock(crawlerMock, grainFactoryMock);
                }
                else
                {
                    crawlerMock.Setup(c => c.PersistState(It.IsAny <CrawlStateSnapshot>()))
                    .Returns(Task.CompletedTask);

                    crawlerMock.Setup(c => c.GrainFactory)
                    .Returns(() => grainFactoryMock.Object);

                    crawlerMock.Setup(c => c.GrainFactory.GetGrain <IProcessCrawlRequests>(
                                          It.IsAny <string>(),
                                          It.IsAny <string>()))
                    .Returns <string, string>((grainId, _) => createCrawler(grainId));

                    crawlerMock.Setup(c => c.Process(It.IsAny <CrawlRequestBase>()))
                    .CallBase();
                }

                return(crawlerMock.Object);
            }

            if (configureContainer != null)
            {
                configureContainer(containerBuilder);
            }
            else
            {
                containerBuilder.RegisterType <CrawlJobPerformer>()
                .InstancePerBackgroundJob();
                containerBuilder.Register(ctx => grainFactoryMock.Object)
                .As <IGrainFactory>();
            }

            var container    = containerBuilder.Build();
            var activator    = new AutofacJobActivator(container);
            var jobPerformer = new BackgroundJobPerformer(JobFilterProviders.Providers, activator);

            Func <Job, CreateContext> createContext = (Job job) =>
                                                      new CreateContext(
                jobStorage,
                jobStorage.GetConnection(),
                job,
                new EnqueuedState());

            Func <Job, BackgroundJob> createBackgroundJob = (Job job) =>
                                                            jobFactory.Create(createContext(job));

            return(
                () => new BackgroundJobServer(
                    new BackgroundJobServerOptions
            {
                Activator = activator,
                WorkerCount = Environment.ProcessorCount
            },
                    jobStorage,
                    Enumerable.Empty <IBackgroundProcess>(),
                    JobFilterProviders.Providers,
                    activator,
                    jobFactory,
                    jobPerformer,
                    stateChanger),
                createCrawler,
                grainFactoryMock.Object,
                strategy,
                jobClient,
                jobFactory,
                jobPerformer,
                activator,
                (Job job) => createBackgroundJob(job),
                (Job job) => createContext(job),
                (BackgroundJob job) =>
            {
                var token = new JobCancellationToken(false);
                var result = jobPerformer.Perform(
                    new PerformContext(
                        jobStorage.GetConnection(),
                        job,
                        token));

                return (result, token);
            });
        }