public static void Initialize(bool startWorkers = true, Action <RabbitMqJobsOptions> configureAction = null)
        {
            var options = new RabbitMqJobsOptions
            {
                RabbitMqSettings = new RabbitMqSettings()
            };

            configureAction?.Invoke(options);

            var massiveJobsSettings = CreateJobsSettings(options);

            var publisher = new RabbitMqMessagePublisher(options.RabbitMqSettings, massiveJobsSettings, options.JobLoggerFactory.SafeCreateLogger <RabbitMqMessagePublisher>());
            var consumer  = new RabbitMqMessageConsumer(options.RabbitMqSettings, massiveJobsSettings, options.JobLoggerFactory.SafeCreateLogger <RabbitMqMessageConsumer>());

            var serviceScopeFactory = new DefaultServiceScopeFactory(
                massiveJobsSettings,
                publisher,
                consumer,
                options.JobLoggerFactory,
                options.JobSerializer,
                options.JobTypeProvider
                );

            MassiveJobsMediator.Initialize(serviceScopeFactory);

            if (startWorkers)
            {
                MassiveJobsMediator.DefaultInstance.StartJobWorkers();
            }
        }
        public static MassiveJobsSettings CreateJobsSettings(RabbitMqJobsOptions options)
        {
            var rabbitMqSettings = options.RabbitMqSettings;

            return(new MassiveJobsSettings
            {
                MaxDegreeOfParallelismPerWorker = options.MaxDegreeOfParallelismPerWorker,

                ImmediateWorkersCount = options.ImmediateWorkersCount,
                LongRunningWorkersCount = options.LongRunningWorkersCount,
                ScheduledWorkersCount = options.ScheduledWorkersCount,
                PeriodicWorkersCount = options.PeriodicWorkersCount,
                PublishBatchSize = options.PublishBatchSize,

                ImmediateWorkersBatchSize = options.ImmediateWorkersBatchSize,
                LongRunningWorkersBatchSize = options.LongRunningWorkersBatchSize,
                ScheduledWorkersBatchSize = options.ScheduledWorkersBatchSize,
                PeriodicWorkersBatchSize = options.PeriodicWorkersBatchSize,

                MaxQueueLength = options.MaxQueueLength,

                ImmediateQueueNameTemplate = $"{rabbitMqSettings.NamePrefix}{Constants.ImmediateQueueNameTemplate}",
                LongRunningQueueNameTemplate = $"{rabbitMqSettings.NamePrefix}{Constants.LongRunningQueueNameTemplate}",
                ScheduledQueueNameTemplate = $"{rabbitMqSettings.NamePrefix}{Constants.ScheduledQueueNameTemplate}",
                ErrorQueueName = $"{rabbitMqSettings.NamePrefix}{Constants.ErrorQueueName}",
                FailedQueueName = $"{rabbitMqSettings.NamePrefix}{Constants.FailedQueueName}",
                StatsQueueName = $"{rabbitMqSettings.NamePrefix}{Constants.StatsQueueName}",
                PeriodicQueueNameTemplate = $"{rabbitMqSettings.NamePrefix}{Constants.PeriodicQueueNameTemplate}",
            });
        }