基于文件存在的石英触发器

本文关键字:存在 石英 触发器 文件 于文件 | 更新日期: 2023-09-27 18:10:56

我是使用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);
}

但是好像工作从来没有开始过。

TestEmail和TestFileTrigger只是打印到控制台的时刻。布尔值TestFileTrigger。fileexist来自于检查文件是否存在于给定位置(它确实存在)。

编辑:TestFileTrigger。fileexist是一个布尔值。添加了Job1/Job2的定义,如果有帮助的话。

编辑:我发现如果我把Thread.Sleep(TimeSpan.FromSeconds(x));放在if语句之前,如果条件满足,if语句就会运行。(x是秒数)为什么它在这种情况下有效,而不是在其他情况下?我不能总是知道需要多少秒才能满足条件。

基于文件存在的石英触发器

这是什么类型的应用程序?

如果这是,例如,一个Windows服务-保持调度程序活动,以便它挂起,根据您的触发器执行作业,您需要这样做:

ThreadStart start = SetupSchedules()
var thread = new Thread(start) { Name = "mysvc" }
thread.Start();

. .这将进入Windows服务的override void OnStart(string[] args)方法。

SetupSchedules方法将是钩子到石英作业的东西,将是类似的(你在OP上面写的代码将是一个良好的开端):

ISchedulerFactory factory = new StdSchedulerFactory();
JobScheduler = factory.GetScheduler();
JobScheduler.ScheduleJob(job1, trigger1);

这应该使它保持活动状态,以便执行作业。我在这里省略了一堆东西,但希望这能给你一些指导,帮助你把它编织到你的应用中。

你还需要这样的东西:

private void ManageThread()
{
   var _thread = Thread.CurrentThread;
   while (!_threadMustStop) // false by default, set this to true in a 'shutdown' process
   {
       Thread.Sleep(10000);
   }
}

…你可以从SetupSchedules方法

中调用它

看起来你不理解这里涉及的并发和线程。

问题如下。

你的主线程做以下事情。

  1. 创建两个作业
  2. 给每个作业一个触发器
  3. 计划作业1启动
  4. 检查TestFileTrigger.fileExistence,如果为真,启动Job2(如果为假,则不运行)。

那么一个线程池线程将启动Job1。最可能的设置是TestFileTrigger.fileExistence = true。但是主线程已经完成了它的工作。

鳍。

在任何时候都不要回去检查TestFileTrigger.fileExistence是否为真。所以它的结果是无关的。在得到结果之前,你实际上是在检查结果。

通过添加Thread.Sleep,您可以给job1足够的时间来完成并给出结果(job1是异步并发运行的,很明显您希望它同步运行)。想象一下,例如,你告诉你的朋友Fred去商店买披萨,并把它放在你的桌子上(异步),然后马上转过身来,想知道为什么你的桌子上没有披萨。

同步是指你自己去商店买了一个披萨,带回家放在桌子上,然后从桌子上吃披萨。

JobScheduler.ScheduleJob(job1, trigger1);是异步工作的

您应该创建一个作业来完成步骤4,并安排它定期运行,或者您使用内置的FileScanJob来代替。