Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Quartz.net cron触发器表达式每两周一次_C#_Xml_Quartz.net - Fatal编程技术网

C# Quartz.net cron触发器表达式每两周一次

C# Quartz.net cron触发器表达式每两周一次,c#,xml,quartz.net,C#,Xml,Quartz.net,我需要创建cron触发器,它每两周在周五运行一次 0 30 17 ? * FRI#2 * 这是我设法创建的,但它生成的时间表只是在每月的第二个星期五运行。是否可以使用Cron Expression实现我需要的功能 我在quartz.net 2.x中听说了新的触发器类型,但没有得到在XML配置文件中配置它的好例子。我的意思是,日历间隔触发器有人能帮助我获得想要的结果吗 更新 var trigger = TriggerBuilder.Create()

我需要创建cron触发器,它每两周在周五运行一次

0 30 17 ? * FRI#2 *
这是我设法创建的,但它生成的时间表只是在每月的第二个星期五运行。是否可以使用
Cron Expression
实现我需要的功能

我在
quartz.net 2.x
中听说了新的触发器类型,但没有得到在XML配置文件中配置它的好例子。我的意思是,日历间隔触发器有人能帮助我获得想要的结果吗

更新

            var trigger = TriggerBuilder.Create()
            .WithIdentity("InvoiceGenerator", "InvoiceGenerator")
            .StartNow()
            .WithSchedule(CalendarIntervalScheduleBuilder.Create().WithIntervalInWeeks(2)).Build();
这是我设法在c端创建的(不幸的是没有xml),但是当我调用触发器上的GetNextFireTimeUtc时,它总是返回null

更新 谢谢你们的回答,我想出的办法是创建正常的cron触发器,每周五运行一次,并在执行过程中检查两周是否通过了上次运行

对于c#,它是以下代码片段

        var friday = new DateTime(2015, 04, 10, 17, 30, 00);
        var trigger = TriggerBuilder.Create()
                .WithIdentity("InvoiceGenerator", "InvoiceGenerator")
                .WithCalendarIntervalSchedule(x => x.WithIntervalInWeeks(2))
                .WithDescription("trigger")
                .StartAt(friday)
                .Build();
        var nexRun = trigger.GetFireTimeAfter(friday);
在这种情况下,nexRun是正确的。
现在剩下的唯一一件事就是找出我们可以使用XML配置它的人。

这是用cron表达式无法实现的。你可以通过在你的石英工作中添加三个触发器来接近它,尽管五个星期五不能满足你几个月的要求

第一个触发器应在每月的第一个星期五触发:

0 30 17 ? * FRI#1 *
第二个触发器应该在本月的第三个星期五触发

0 30 17 ? * FRI#3 *
第三个触发点需要处理第五个星期五的月份:

0 30 17 ? * FRI#5 *
最后一次触发并不完美,因为下一次跑步将在一周后进行


或者,您可以创建一个cron表达式,每周使用Quartz作业检查最后一次触发时间进行触发,如果最后一次触发时间小于14天前,则不执行任何操作。

使用一个触发器以编程方式执行此操作相当简单。我认为这不能通过一个cron表达式来实现

        var friday = new DateTime(2015, 04, 02, 17, 30, 00)
        var trigger = TriggerBuilder.Create()
                .WithIdentity("InvoiceGenerator", "InvoiceGenerator")
                .WithCalendarIntervalSchedule(x => x.WithIntervalInWeeks(2))
                .WithDescription("trigger")
                .StartAt(friday) 
                .Build();
在我看来,您正在使用RAMJobStore,在这种情况下,触发器保存在quartz_jobs.xml文件中。确实可以用XML设置日历间隔。例如,上述触发器将转换如下:

<trigger>
  <calendar-interval>
    <name>calendarJobName</name>
    <group>calendarJobGroup</group>
    <description>CalendarTriggerDescription</description>
    <job-name>jobName1</job-name>
    <job-group>jobGroup1</job-group>
    <start-time>2015-04-02T17:30:00.0Z</start-time>
    <end-time>2099-04-02T17:30:00.0Z</end-time>
    <misfire-instruction>SmartPolicy</misfire-instruction>
    <repeat-interval>2</repeat-interval>
    <repeat-interval-unit>Week</repeat-interval-unit>
  </calendar-interval>
</trigger>

日历作业名
日历作业组
日历触发器描述
职位名称1
工作组1
2015-04-02T17:30:00.0Z
2099-04-02T17:30:00.0Z
智能策略
2.
周

我解决了这个问题,为一周中的每一天创建多个作业,然后使用CalendarIntervalsScheduleBuilder设置每周间隔。不过,您必须手动计算下一个起始日期

例如


你的意思是在执行时检查上次开火时间,如果DateTime.Today()-上次开火时间少于14天,则什么都不做?是的,除非你能让CalendarIntervalTrigger正常工作,否则这可能是实现这一点最简单的方法。目前这对我们来说似乎还可以。非常感谢。你能不能也提供CalendarIntervalTrigger的链接?我只在CalendarIntervalTrigger上找到了这个博客,尽管它没有提供一个实际的例子:。请注意,最新的Quartz.net 2.2.3版包含CalendarIntervalTrigger的多个错误修复,因此如果可以的话,可能值得更新到此版本。GetNextFireTimeUtc在第一次触发触发器之前为null。这里唯一的问题是,如果在调用GetNextFireTimeUtc()后编写此代码,返回值始终为null。我不知道为什么我只是创建了控制台应用程序,在main方法中只是复制并粘贴了这段代码,但GetNextFireTimeUtc()的结果还是一样的nullmethod@Rati_Ge调用GetNextFireTimeUtc()之后?您需要先计划触发器,然后调用方法,如中所述。是2099-04-02T17:30:00.0Z必需的还是我可以忽略此标记以便永远运行?
For each DayOfWeek in MyDaysOfWeek
    StartDate = GetNextWeekDay(JobStartDate,DayOfWeek)
    Dim Sched = CalendarIntervalScheduleBuilder.Create().WithIntervalInWeeks(Interval).WithMisfireHandlingInstructionDoNothing()

    Dim JobTrigger = TriggerBuilder.Create().WithIdentity(JobTriggerName).
                            StartAt(StartDate).WithSchedule(Sched).EndAt(EndDate).Build()

     'Add to your scheduler here
next