c# – 基于文件存在的Quartz触发器?
作者:互联网
我是使用Quartz的新手,我对触发器有疑问.是否有可能基于文件存在触发?我想让Quartz运行一个工作,直到找到某个文件,然后停止运行该工作,或者转到另一个工作.
例如,我想做这样的事情:
(1)Job1每隔60秒检查一次给定目录中是否存在File.txt.
(2)如果找到File.txt,则触发Job2启动. Job1停止检查文件是否存在.
现在,我有:
// Job definitions
var Job1 = JobBuilder.Create<TestEmail>().WithIdentity("job1", "group1").Build();
var Job2 = JobBuilder.Create<TestFileTrigger>().WithIdentity("job2", "group2").Build();
// Triggers
ITrigger trigger1 = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1").StartNow()
.WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever())
.Build();
ITrigger trigger2 = TriggerBuilder.Create()
.WithIdentity("trigger2", "group2").StartNow()
.Build();
// Schedule jobs
scheduler.ScheduleJob(Job1, trigger1);
if (TestFileTrigger.fileExistence == true)
{
scheduler.ScheduleJob(Job2, trigger2);
}
但似乎Job2永远不会开始.
TestEmail和TestFileTrigger此时只需打印到控制台.布尔值TestFileTrigger.fileExistence来自检查文件是否存在于给定位置(它确实存在).
编辑:
TestFileTrigger.fileExistence是一个布尔值.如果有帮助,添加了Job1 / Job2的定义.
编辑:
我发现如果我把Thread.Sleep(TimeSpan.FromSeconds(x));在if语句之前,if语句将在满足条件时运行. (其中x是一些秒数.)为什么它在这种情况下有效,但不是这样?我不能总是知道要满足条件需要多少秒.
解决方法:
看起来您不了解此处涉及的并发和线程.
问题如下.
您的主要线程执行以下操作.
>创建两个作业
>给每个工作一个触发器
>安排Job1开始
>检查TestFileTrigger.fileExistence,如果为true,则启动Job2(它为false,因此不运行).
然后线程池线程将启动Job1.最有可能设置TestFileTrigger.fileExistence = true.但是主线程已经完成了它的工作.
鳍.
在任何时候你都不回去检查TestFileTrigger.fileExistence是否为真.所以它的结果无关紧要.事实上,在得到结果之前,您正在检查结果.
通过添加一个Thread.Sleep,你可以给job1足够的时间来完成并给你一个结果(job1以异步和并发的方式运行,很明显你希望它能同步运行).想象一下,例如你告诉你的朋友弗雷德去商店购买比萨饼并把它放在你的桌子上(异步),然后马上转过身来,想知道为什么你的桌子上没有披萨.
同步将是你自己去商店,买了一个披萨,把它带回家把它放在你的桌子上,然后从你的桌子上吃披萨.
JobScheduler.ScheduleJob(job1,trigger1);确实是异步工作的.
您应该创建一个作业来包装第4步并安排定期运行,或者使用内置的FileScanJob代替.
标签:c,quartz-scheduler,quartz-net 来源: https://codeday.me/bug/20190708/1404437.html