2011-08-16 47 views
1

我想知道是否有可能使用每周触发器触发一次,然后去一个周计划可能立刻每周触发一周触发器?

Trigger trigger = TriggerUtils.MakeWeeklyTrigger(
    "TriggerName", 
    dayOfweek, 
    timeOfDay.Hours, 
    timeOfDay.Minutes); 

所以我基本上要当我的第一个服务开始我的触发条件和运行它的工作。之后,我希望基于用户设置每周工作(所以也许在第一次运行后用户将其设置为星期一上午5:00)。

回答

3

您可以将多个触发器与一个作业关联。人们会立刻只有一次火灾和其他将每周火:

var jobDetail = new JobDetail("MyJob", "MyGroup", typeof(T)); 

// run in ten seconds, only once. 
var once = new SimpleTrigger("Once", 
          null, 
          DateTime.UtcNow.AddSeconds(10), 
          null, 
          0, 
          TimeSpan.Zero); 

// run weekly, start in 5 minutes to give 'once' trigger some time to run 
Trigger weekly = TriggerUtils.MakeWeeklyTrigger(
    "Weekly", 
    dayOfweek, 
    timeOfDay.Hours, 
    timeOfDay.Minutes); 
weekly.StartTimeUtc = DateTime.UtcNow.Add(TimeSpan.FromMinutes(5)); 

once.JobName = jobDetail.Name; 
weekly.JobGroup = jobDetail.Group; 
once.JobName = jobDetail.Name; 
weekly.JobGroup = jobDetail.Group; 

_quartzScheduler.ScheduleJob(jobDetail, once); 
_quartzScheduler.ScheduleJob(weekly); 

或者你可以安排立即触发,当它触发重新安排为每周:

private static volatile Boolean firstRun = false; 

public void Execute(JobExecutionContext context) { 
    if(firstRun) { 
     Trigger weekly = TriggerUtils.MakeWeeklyTrigger(
      "Weekly", 
      dayOfweek, 
      timeOfDay.Hours, 
      timeOfDay.Minutes); 

     context.Scheduler.RescheduleJob("Once", "MyGroup", weekly); 
     firstRun = false; 
    } 
} 

另一种选择是只运行代码在启动时不涉及Quartz。只需使用ThreadPool。然后让Quartz只处理每周计划。如果你的代码不依赖于Quartz,这可能是一个好主意。

+0

好吧,只是觉得有可能没有做出2触发器的方式。当我测试一次触发器时,我发现它实际上运行了两次,所以我确实喜欢它们曾经有过的例子。 – chobo2

+0

@ chobo2:答案中的重复时间参数等于1.它是否多次触发?还是它是另一个触发器?你用什么样的例子? – Dmitry

+0

@德米特里 - 这是同样的触发器,因为每个人都有相同的名字。这是我从石英文档中使用 - SimpleTrigger触发=新SimpleTrigger( “myTrigger”, 空, DateTime.UtcNow.AddSeconds(10),空 , 0, TimeSpan.Zero); – chobo2