簡體   English   中英

Cron作業僅執行一次?

[英]Cron Job Only Executes Once?

我試圖在Quartz.NET( 版本2.4.1.0 )中為cron作業創建一個石英調度程序。 我有一項作業以其指定的間隔觸發,另一項作業在開始時觸發一次,再也不會觸發(它也具有指定的間隔)。
我有些沮喪,因為這些工作的唯一變化是他們的姓名和CronSchedules(在觸發器中找到)。

注意:我已經研究了與此在線上類似的問題(以及Stack Overflow),但沒有找到解決我的問題的方法。
我的數據庫連接工作正常(在此示例中,UID / PWD留空)。
所有Cron表達式均已在CronMaker中進行了測試,並且有效。

應用配置

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
  </configSections>
  <quartz>
    <add key="quartz.scheduler.instanceName" value ="MyScheduler"/>
    <!--5 is recommended for under 100 jobs-->
    <add key="quartz.threadPool.threadCount" value ="5"/>
    <add key="quartz.jobStore.useProperties" value =" false"/>
    <add key="quartz.jobStore.clustered" value ="false"/>
    <add key="quartz.jobStore.misfireThreshold" value ="60000"/>
    <add key="quartz.jobStore.type" value ="Quartz.Impl.AdoJobStore.JobStoreTX, Quartz"/>
    <add key="quartz.jobStore.driverDelegateType" value ="Quartz.Impl.AdoJobStore.StdAdoDelegate, Quartz"/>
    <add key="quartz.jobStore.tablePrefix" value ="QRTZ_"/>
    <add key="quartz.jobStore.dataSource" value ="myDS"/>
    <!--DB CONNECTION-->
    <add key="quartz.dataSource.myDS.connectionString" value ="Server=localhost;Database=QUARTZ;Uid=;Pwd="/>
    <add key="quartz.dataSource.myDS.provider" value ="SqlServer-20"/>
  </quartz>
</configuration>

Program.cs中

注意:作業3每分鍾成功觸發一次。 作業4在開始時觸發一次,然后停止觸發(應該每30秒觸發一次)。

工作:

public class Job3 : IJob
        {
            public void Execute(IJobExecutionContext context)
            {
                Console.WriteLine("Job 3");
            }
        }

public class Job4 : IJob
        {
            public void Execute(IJobExecutionContext context)
            {
                Console.WriteLine("Job 4");
            }
        }

職位詳情:

IJobDetail jdJob3 = JobBuilder.Create<Job3>()
                        .WithIdentity("job3", "group3")
                        .WithDescription("CRON TRIGGER - Job meant to run constantly at 1min intervals")
                        .StoreDurably(true)
                        .Build();

IJobDetail jdJob4 = JobBuilder.Create<Job4>()
                        .WithIdentity("job4", "group3")
                        .WithDescription("CRON TRIGGER - Job meant to run constantly at 30sec intervals")
                        .StoreDurably(true)
                        .Build();

觸發器:

//Day Of Month - fires every minute
ITrigger tChron2 = TriggerBuilder.Create()
     .WithIdentity("myTrigger3", "group3")
     .WithCronSchedule("0 0/1 * * * ?", x => x
          .InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("Central America Standard Time"))
          .WithMisfireHandlingInstructionFireAndProceed()) //handle misfire
      .ForJob("job3", "group3")
      .Build();

//Day Of Month - fires every 30sec, between 8am and 2pm, on the 26th of every month, any year
ITrigger tChron3 = TriggerBuilder.Create()
     .WithIdentity("myTrigger4", "group3")
     .WithCronSchedule("0,30 * 8-14 26 * ?", x => x
          .InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("Central America Standard Time"))
          .WithMisfireHandlingInstructionFireAndProceed()) //handle misfire
     .ForJob("job4", "group3")
     .Build();

作業偵聽器:

public class MyJobListener : IJobListener
    {
        void IJobListener.JobExecutionVetoed(IJobExecutionContext context)
        {
            throw new NotImplementedException();
        }

        void IJobListener.JobToBeExecuted(IJobExecutionContext context)
        {
            Console.WriteLine("\r\nJob is about to be executed...");
        }

        void IJobListener.JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException)
        {
            Console.WriteLine("Job was executed...");
        }

        public string Name { get; set; }
    }

//IMPLEMENTATION    
MyJobListener myJobListener = new MyJobListener();
myJobListener.Name = "MyJobListener1";
scheduler.ListenerManager.AddJobListener(myJobListener, GroupMatcher<JobKey>.AnyGroup());

OUTPUT

在此處輸入圖片說明

關於什么可能導致此的任何想法?

我發現代碼沒有錯。

我唯一能想到的是,您的Job 4最終以某種異常結束,該異常由Quartz靜默處理,但使它無法安排下一次執行。

也許添加一個JobListener,看看是否可以使用它來解決正在發生的事情。

我能夠查明問題。
我沒有正確處理數據庫中的數據。

運行項目后,我將首先從QRTZ_TRIGGERS表中刪除所有行,然后從QRTZ_JOB_DETAILS表中刪除所有行。 這將允許我運行項目而不會收到錯誤:“無法存儲作業”。 我沒有意識到的是QRTZ_CRON_TRIGGERS表在每次連續運行時都在復制其字段(我在下面運行不同的示例): 在此處輸入圖片說明

當我更新cron表達式時,這會導致沖突,因為存在同一計划的多個實例。

為了解決這個問題,我使用了“ ScheduleJobs”並將替換值設置為true:

//JOB SCHEDULE CREATOR    
private static void JSCreator(IScheduler scheduler, IJobDetail jdJob, ITrigger tTrig)
            {
                var SJ = new Dictionary<IJobDetail, Quartz.Collection.ISet<ITrigger>>();
                SJ.Add(jdJob, new Quartz.Collection.HashSet<ITrigger>() { tTrig });
                scheduler.ScheduleJobs(SJ, true);
            }


 //IMPLEMENTATION
 JSCreator(scheduler, jdJob1, tSimple1);
 JSCreator(scheduler, jdJob2, tCron1);
 JSCreator(scheduler, jdJob3, tCron2);
 JSCreator(scheduler, jdJob4, tCron3);
 JSCreator(scheduler, jdJob5, tCron4);
 JSCreator(scheduler, jdJob6, tCron5);

這將刪除所有現有數據,並將其替換為我當前正在運行的作業中找到的數據。 現在我所有的工作都正常運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM