Quartz Scheduler作业不能同时工作 Allsways只工作一个

问题描述

问题:我的工作无法同时进行。始终只能工作一个代码有什么问题。

程序运行如下:

enter image description here

预期的跑步次数

** info:exampleProject.Api.Services.QuartzServices.Job1 [0] Job1正在工作...

信息:exampleProject.Api.Services.QuartzServices.Job2 [0] Job2正在工作... **

CustomQuartzHostedService

public class CustomQuartzHostedService : IHostedService
    {
        private readonly ISchedulerFactory schedulerFactory;
        private readonly IJobFactory jobFactory;
        private readonly JobMetadata jobMetadata;
        public CustomQuartzHostedService(ISchedulerFactory
            schedulerFactory,JobMetadata jobMetadata,IJobFactory jobFactory)
        {
            this.schedulerFactory = schedulerFactory;
            this.jobMetadata = jobMetadata;
            this.jobFactory = jobFactory;
        }
        public IScheduler Scheduler { get; set; }
        public async Task StartAsync(CancellationToken cancellationToken)
        {
            Scheduler = await schedulerFactory.GetScheduler();
            Scheduler.JobFactory = jobFactory;
            var job = CreateJob(jobMetadata);
            var trigger = CreateTrigger(jobMetadata);
            await Scheduler.ScheduleJob(job,trigger,cancellationToken);
            await Scheduler.Start(cancellationToken);
        }
        public async Task StopAsync(CancellationToken cancellationToken)
        {
            await Scheduler?.Shutdown(cancellationToken);
        }
        private ITrigger CreateTrigger(JobMetadata jobMetadata)
        {
            return TriggerBuilder.Create()
            .WithIdentity(jobMetadata.JobId.ToString())
            .WithCronSchedule(jobMetadata.CronExpression)
            .WithDescription($"{jobMetadata.JobName}")
            .Build();
        }
        private IJobDetail CreateJob(JobMetadata jobMetadata)
        {
            return JobBuilder
            .Create(jobMetadata.JobType)
            .WithIdentity(jobMetadata.JobId.ToString())
            .WithDescription($"{jobMetadata.JobName}")
            .Build();
        }
    }

CustomQuartzJobFactory

public class CustomQuartzJobFactory : IJobFactory
    {
        private readonly IServiceProvider _serviceProvider;
        public CustomQuartzJobFactory(IServiceProvider serviceProvider)
        {
            _serviceProvider = serviceProvider;
        }
        public IJob NewJob(TriggerFiredBundle triggerFiredBundle,IScheduler scheduler)
        {
            var jobDetail = triggerFiredBundle.JobDetail;
            return (IJob)_serviceProvider.GetService(jobDetail.JobType);
        }
        public void ReturnJob(IJob job) { }
    }

工作元数据

public class JobMetadata
    {
        public Guid JobId { get; set; }
        public Type JobType { get; }
        public string JobName { get; }
        public string CronExpression { get; }
        public JobMetadata(Guid Id,Type jobType,string jobName,string cronExpression)
        {
            JobId = Id;
            JobType = jobType;
            JobName = jobName;
            CronExpression = cronExpression;
        }
    }

工作1

   [disallowConcurrentExecution]
    public class Job1 : IJob
    {
        private readonly ILogger<Job1> _logger;
        public Job1(ILogger<Job1> logger)
        {
            _logger = logger;
        }
        public async Task Execute(IJobExecutionContext context)
        {
            _logger.Loginformation("Job1 is working...");
        }
    }

工作2

 [disallowConcurrentExecution]
    public class Job2 : IJob
    {
        private readonly ILogger<Job2> _logger;
        public Job2(ILogger<Job2> logger)
        {
            _logger = logger;
        }
        public async Task Execute(IJobExecutionContext context)
        {
            _logger.Loginformation("Job2 is working...");
        }
    }

Startup.cs

    services.AddSingleton<IJobFactory,CustomQuartzJobFactory>();
    services.AddSingleton<ISchedulerFactory,StdSchedulerFactory>();
    services.AddSingleton<Job1>();
    services.AddSingleton<Job2>();

    services.AddSingleton(new JobMetadata(Guid.NewGuid(),typeof(Job1),"Job1 Defination","0/10 * * ? * * *")); //Every 10 seconds
    services.AddSingleton(new JobMetadata(Guid.NewGuid(),typeof(Job2),"Job2 Defination","0/10 * * ? * * *")); //Every 10 seconds

    services.AddHostedService<CustomQuartzHostedService>();

解决方法

这是一个正在运行的演示:

将JobMetadata jobMetadata更改为CustomQuartzHostedService中的列表:

public class CustomQuartzHostedService: IHostedService
    {
        private readonly ISchedulerFactory schedulerFactory;
        private readonly IJobFactory jobFactory;
        private readonly List<JobMetadata> jobMetadatas;
        public CustomQuartzHostedService(ISchedulerFactory
            schedulerFactory,List<JobMetadata> jobMetadatas,IJobFactory jobFactory)
        {
            this.schedulerFactory = schedulerFactory;
            this.jobMetadatas = jobMetadatas;
            this.jobFactory = jobFactory;
        }
        public IScheduler Scheduler { get; set; }
        public async Task StartAsync(CancellationToken cancellationToken)
        {
            Scheduler = await schedulerFactory.GetScheduler();
            Scheduler.JobFactory = jobFactory;
            foreach (var j in jobMetadatas) {
                var job = CreateJob(j);
                var trigger = CreateTrigger(j);
                await Scheduler.ScheduleJob(job,trigger,cancellationToken);
            }
            await Scheduler.Start(cancellationToken);
        }
        public async Task StopAsync(CancellationToken cancellationToken)
        {
            await Scheduler?.Shutdown(cancellationToken);
        }
        private ITrigger CreateTrigger(JobMetadata jobMetadata)
        {
            return TriggerBuilder.Create()
            .WithIdentity(jobMetadata.JobId.ToString())
            .WithCronSchedule(jobMetadata.CronExpression)
            .WithDescription($"{jobMetadata.JobName}")
            .Build();
        }
        private IJobDetail CreateJob(JobMetadata jobMetadata)
        {
            return JobBuilder
            .Create(jobMetadata.JobType)
            .WithIdentity(jobMetadata.JobId.ToString())
            .WithDescription($"{jobMetadata.JobName}")
            .Build();
        }
    }

在启动时添加List<JobMetadata>(我每3秒钟进行一次测试):

            JobMetadata j1 = new JobMetadata(Guid.NewGuid(),typeof(Job1),"Job1 Defination","0/3 * * ? * * *");//Every 3 seconds
            JobMetadata j2 = new JobMetadata(Guid.NewGuid(),typeof(Job2),"Job2 Defination","0/3 * * ? * * *");//Every 3 seconds
            services.AddSingleton(new List<JobMetadata> { j1,j2});

结果: enter image description here

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...