2015-01-07 2 views
0

내가 템플릿의 목록을 각 매개 변수, 의 다른 세트를 가지고 있으며, 각 템플릿은 특정 time.How에서 실행하는 내가 석영 스케줄러여러 트리거/크론 표현 하나의 석영 작업

에서이 문제를 접근 할
Template Parameters list     Time of execution 
T1  ['date','frequency']   3:30 AM 
T2  ['Id']       10:20 AM 
T3  ['customerid','houseNo','Info'] 6:06 PM 

및 실행() 메소드는 각 template.I는 하나의 석영 작업에서이 작업을 수행 할 수 에 대한 매개 변수 목록에 대한 몇 가지 작업을 수행합니다. 나는이 같은 것을 시도하고 있었다 : 누군가가 접근 방식과 함께이 문제에 더 나은 방법을 제공 할 수 있는지 내가 어떤 만족스러운 답변 없이 전에 비슷한 질문을 한

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); 
    } 

를, 그것은 매우 도움이 될 것입니다 몇 가지 가이드 또는 유용한 링크를 예약 기본 및 고급 주제를 통해 나를 걸을 수 있도록 내가 여러 트리거를 사용하는 방법에 대한 더 나은 이해 또는 위의 문제에 접근하는 방법을 .

답변

0

내가하는 일은 모든 템플릿에 공통적으로 필요한 비즈니스 로직을 구현하는 단일 작업에 대해 여러 개의 트리거를 생성한다는 것입니다.

각 트리거에는 트리거와 연결할 수있는 JobDataMap에 지정된 템플릿 매개 변수가 있습니다. 작업이 트리거됩니다 및 execute 방법을 사용하면 관련 템플릿 매개 변수에 액세스하려면 다음 코드를 사용하여 호출되면 :

context.getMergedJobDataMap() 

은 자세한 내용은 getMergedJobDataMap의 JavaDoc을 참조하십시오. 자바

예 :

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); 

     ... 
     } 
    } 

템플릿 처리 로직은 개별 템플릿 크게 다른 경우, 당신은 아마 템플릿의 각각에 대해 별도의 작업을 구현해야합니다.

+0

안녕하세요 jan .. 당신은 Quartz 스케줄러 작업 내에서 JobDataMap을 사용하는 기본 코드를 제공하고 매번 다른 매개 변수를 전달합니다 ... 심지어 기본 코드도 수행 할 것입니다. 나는 또한 트리거가 {}인지 알고 싶고() 석영 작업에 필수입니까? – elyon

+0

확인을 눌러 샘플 코드를 추가하십시오. 다행히 아이디어를 얻고 Grails에 포팅 할 수 있기를 바랍니다. 귀하의 질문에 관해서는 Grails에 대해서는 잘 모르겠지만 Java에서는 execute 메소드가 필수입니다. 작업은 0 ~ N 개의 트리거를 가질 수 있습니다. 연관된 트리거가없는 작업을 실행하고 그 작업을 실행하면, 작업이 튼튼하다고 표시되지 않으면 Quartz가 작업을 완료하자 마자 자동으로 삭제됩니다. 자습서를 포함하여 Quartz 문서를 읽는 것이 좋습니다. –

+0

코드에 대해 고마워. :) JobDetail TrialJob = JobBuilder.newJob (TemplateJob.class)이 줄이 실패했습니다. (Groovy : 겉보기 변수 'TemplateJob'이 정적 범위에서 발견되었지만 참조하지 않았습니다. 지역 변수, 정적 필드 또는 클래스.)? – elyon

관련 문제