环境:quazrtz.net实现,asp.net core mvc
一个计划分内外两层,类似大循环套小循环。当前一个内外两层循环执行完成后,依次进入下一个内外两层循环(内外两层非无限)。
1.外层:等待N分钟,开灯N分钟后关闭。再等待N分钟,进入下一步。
2.下一步:如果有内层,则:等待N分钟,开灯N分钟后关闭(等待时间与上一步的等待时间累加)。
以上有执行次数;如果没有内层,等待N分钟后,进入下一个同样的内外两层循环。
问题:没有等待外层执行完,就进入了内层。尽管加了特性[DisallowConcurrentExecution]
public class MySchedulerFactory
{
/// <summary>
/// 由CLR保证,在程序第一次使用该类之前被调用,而且只调用一次
/// </summary>
private static IScheduler _Scheduler = StdSchedulerFactory.GetDefaultScheduler().Result;
public static IScheduler GetScheduler()
{
return _Scheduler;
}
}
private void FeedingPlanSchedule()
{
//实例化调度器
NameValueCollection pars = new NameValueCollection
{
//线程池个数20
["quartz.threadPool.threadCount"] = "20",
//scheduler名字
["quartz.scheduler.instanceName"] = "MyAdoJobStoreScheduler",
//类型为JobStoreXT,事务
["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz",
//数据源名称
["quartz.jobStore.dataSource"] = "QuartzDb",
//使用mysql的Ado操作代理类
["quartz.jobStore.driverDelegateType"] = "Quartz.Impl.AdoJobStore.MySQLDelegate, Quartz",
//数据源连接字符串
["quartz.dataSource.QuartzDb.connectionString"] = @"server=127.0.0.1;Database=quartzmanager;user id=root;password=123;SslMode=none;",
//数据源的数据库
["quartz.dataSource.QuartzDb.provider"] = "MySql",
//序列化类型
["quartz.serializer.type"] = "json",
//自动生成scheduler实例ID,主要为了保证集群中的实例具有唯一标识
["quartz.scheduler.instanceId"] = "AUTO"
};
IScheduler scheduler = MySchedulerFactory.GetScheduler();
//开启调度器
scheduler.Start();
//创建外层作业
IJobDetail job1 = JobBuilder.Create<FeedingJob.OuterJob>()
.WithIdentity("job1", "groupa")//名称,分组
.Build();
//创建外层触发器
ITrigger trigger1 = TriggerBuilder.Create()
.WithIdentity("trigger1", "groupa")//名称,分组
.StartNow()//从启动的时候开始执行
.WithSimpleSchedule(b =>
{
b.WithIntervalInSeconds(8)//*执行一次
.WithRepeatCount(30);//重复执行3+1次
})
.StartAt(DateBuilder.FutureDate(3, IntervalUnit.Second))//3秒后执行
.Build();
//把外层作业,触发器加入调度器
var state = scheduler.ScheduleJob(job1, trigger1);
//创建内层作业
IJobDetail job2 = JobBuilder.Create<FeedingJob.InnnerJob>()
.WithIdentity("job2", "groupa")//名称,分组
.Build();
//创建内层触发器
ITrigger trigger2 = TriggerBuilder.Create()
.WithIdentity("trigger2", "groupa")//名称,分组
.StartNow()//从启动的时候开始执行
.WithSimpleSchedule(b =>
{
b.WithIntervalInSeconds(2)//*执行一次
.WithRepeatCount(30);//重复执行3+1次
})
.StartAt(DateBuilder.FutureDate(3, IntervalUnit.Second))
.Build();
//把内层作业,触发器加入调度器
scheduler.ScheduleJob(job2, trigger2);
}
public class FeedingJob
{
[DisallowConcurrentExecution]
public class OuterJob : IJob
{
public Task Execute(IJobExecutionContext context)
{
Console.WriteLine("outer job executed:"+DateTime.Now);
return Task.CompletedTask;
}
}
[DisallowConcurrentExecution]
public class InnnerJob : IJob
{
public Task Execute(IJobExecutionContext context)
{
Console.WriteLine("inner job executed:"+DateTime.Now);
return Task.CompletedTask;
}
}