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来自检查文件是否存在于给定位置(它确实存在). 编辑: 编辑: 解决方法
看起来您不了解此处涉及的并发和线程.
问题如下. 您的主要线程执行以下操作. >创建两个作业 然后线程池线程将启动Job1.最有可能设置TestFileTrigger.fileExistence = true.但是主线程已经完成了它的工作. 鳍. 在任何时候你都不回去检查TestFileTrigger.fileExistence是否为真.所以它的结果无关紧要.事实上,在得到结果之前,您正在检查结果. 通过添加一个Thread.Sleep,你可以给job1足够的时间来完成并给你一个结果(job1以异步和并发的方式运行,很明显你希望它能同步运行).想象一下,例如你告诉你的朋友弗雷德去商店购买比萨饼并把它放在你的桌子上(异步),然后马上转过身来,想知道为什么你的桌子上没有披萨. 同步将是你自己去商店,买了一个披萨,把它带回家把它放在你的桌子上,然后从你的桌子上吃披萨. JobScheduler.ScheduleJob(job1,trigger1);确实是异步工作的. 您应该创建一个作业来包装第4步并安排定期运行,或者使用内置的FileScanJob代替. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |