单个Quartz作业中的多个触发器/ Cron表达式

时间:2015-01-07 19:54:43

标签: grails groovy quartz-scheduler

  

我有模板列表,每个模板都有不同的参数集,   并且每个模板必须在特定时间执行。我如何处理   Quartz调度程序中的这个问题

 Template  Parameters list                 Time of execution
 T1        ['date','frequency']            3:30 AM
 T2        ['Id']                          10:20 AM
 T3        ['customerid','houseNo','Info'] 6:06 PM
  

和execute()方法将对参数列表执行一些操作   每个模板。我想在单个Quartz作业中执行此操作。我在努力   像这样的东西:

  def list = ["*/2 * * * * ?","*/10 * * * * ?","*/20 * * * * ?"]
  String triggerName;
  int j=0;
  for(cronExpr in list)
  {
        j++;
        triggerName="trigger"+Integer.toString(j)
        triggerName = new CronTrigger();
        triggerName.setName(triggerName);
        triggerName.setGroup(job.getGroup());
        triggerName.setJobName(job.getName());
        triggerName.setJobGroup(job.getGroup());
        triggerName.setCronExpression(cronExpr);
  }
  

我之前没有得到任何满意的答案就问了类似的问题   如果有人能提供更好的方法,那将会非常有帮助   解决这个问题以及石英上的一些指南或有用的链接   调度可以指导我完成基本和高级主题   我对如何使用多个触发器或某些触发器有了更好的理解   解决上述问题的方法。

1 个答案:

答案 0 :(得分:0)

在您的情况下,我可能会做的是,我会为单个作业创建多个触发器,以实现所有模板共有的所需业务逻辑。

每个触发器都会在其JobDataMap中指定可与触发器关联的模板参数。触发作业并调用其execute方法后,您可以使用以下代码访问相关的模板参数:

context.getMergedJobDataMap()

有关详细信息,请参阅getMergedJobDataMap JavaDoc。

Java中的示例:

    public class TemplateJob implements Job {

      public void execute(JobExecutionContext context)
        throws JobExecutionException
      {
        JobDataMap dataMap = context.getMergedJobDataMap();

        String templateId = dataMap.getString("templateId");

        if ("T1".equals(templateId))
        {
          // template1 params
          String t1Date = dataMap.getString("date");
          String t1Frequency = dataMap.getString("frequency");

          doTemplate1Logic(t1Date, t1Frequency);
        }
        else if ("T2".equals(templateId))
        {    
          // template2 params
          String t2Id = dataMap.get("Id");

          doTemplate2Logic(t1Id);
        }    
        else if ("T3".equals(templateId))
        {    
          // template3 params
          String t3CustomerId = dataMap.get("customerid");
          String t3HouseNo = dataMap.get("houseNo");
          String t3Info = dataMap.get("Info");

          doTemplate3Logic(t1Id);
        }
        else
        {
          throw new JobExecutionException("Unrecognized template ID: " + templateId);
        }
      }

      ...
    }


    public class TestCase
    {
      public static void main(String[] args)
      {
        Scheduler scheduler = ....

        JobDetail templateJob = JobBuilder.newJob(TemplateJob.class)
          .withIdentity("templateJob", "myJobGroup")
          .build();          

        // trigger for Temlate1
        Trigger template1Trigger = TriggerBuilder.newTrigger()
          .withIdentity("template1Trigger", "myTriggerGroup")
          .withSchedule(TriggerBuilder.cronSchedule("*/2 * * * * ?"))
          .usingJobData("date", "...")
          .usingJobData("frequency", "...")
          .forJob("templateJob", "myJobGroup")
          .build();      
        scheduler.scheduleJob(templateJob, template1Trigger);

        // trigger for Temlate2
        Trigger template2Trigger = TriggerBuilder.newTrigger()
        ...
        scheduler.scheduleJob(templateJob, template2Trigger);

        ...
      }
    }

如果模板处理逻辑对于单个模板有很大不同,您可能应该为每个模板实现单独的作业。