2015-01-11 5 views
0

Привет мой код работает с несколькими триггеров и я пытаюсь передать определенные параметры, связанные с каждый триггер с помощью jobDataMap.But, когда я пытаюсь присвоить карту в моей конфигурации. заводной к jobDataMap я получаю NullPointerExceptionjobDataMap для передачи параметров для нескольких триггеров в кварце

**This is the Map in my Config.groovy-->** 

Query 
{ 
    Map 
    { 
     time.'0/5 * * * * ?' = ['T1'] 
     time.'0/10 * * * * ?' = ['T2'] 
     templates.'T1' = ['Date','FinshDate','Location'] 
     templates.'T2' = ['TableName'] 
     parameterValues.'T1' = ['2014071600','2014072000','Path'] 
     parameterValues.'T2' = ['AppleData'] 
    } 
} 

**This is my Quartz Job Code for multiple triggers ->** 

import org.quartz.* 
import org.quartz.Trigger 
import static org.quartz.JobBuilder.*; 
import static org.quartz.CronScheduleBuilder.*; 
import static org.quartz.TriggerBuilder.*; 
import org.quartz.impl.StdSchedulerFactory; 
import org.codehaus.groovy.grails.commons.GrailsApplication; 
public class TrialJob 
{ 

    public static void main(String[] args) 
    { 
     String JobName 
     String GroupName 
     GrailsApplication grailsApplication; 
     Trigger trigger 
     def triggerList=[] 
     def jobList=[] 

     def cronList=["0/5 * * * * ?","0/10 * * * * ?","0/15 * * * * ?"] 

     // here i am creating 3 triggers which works fine 
     for(i in 0..2) 
     { 

      JobName="trigger"+Integer.toString(i) 
      GroupName = "Group"+Integer.toString(i) 
      println cronList[i] 
      JobDetail job = JobBuilder.newJob(TestJob.class).withIdentity(JobName,GroupName).build(); 
     trigger= TriggerBuilder.newTrigger().withIdentity(JobName,GroupName).withSchedule(CronScheduleBuilder.cronSchedule(cronList[i])).build(); 
     triggerList.add(trigger) 
     jobList.add(job) 
     } 

     Scheduler scheduler = new StdSchedulerFactory().getScheduler(); 
     scheduler.start(); 

     for(j in 0..2) 
     { 

     // here i want to put the associated parameters for each trigger in the trigger list 
     // For Example 1) trigger 0--> triggerList[0].jobDataMap.put(['Date','FinshDate','Location'],['2014071600','2014072000','Path']) 
     // 2) trigger 1--> triggerList[1].jobDataMap.put(['TableName'],['AppleData']) 
     scheduler.scheduleJob(jobList[j],triggerList[j]); 
     println "torpido" 
     println j 
     } 

    //while(true){}; 
}  

    public static class TestJob implements Job 
    { 
     public void execute(JobExecutionContext context) throws JobExecutionException 
     { 
      HashMap<String, String> parameter = new HashMap(); 
      parameter=context.getMergedJobDataMap() 
      println "Inside Execute" 
     }   
    } 
} 

как я использую jobDataMap внутри выше цикла (это было бы более ясно, глядя на комментарии внутри для цикла) и доступ к ним внутри метода выполнения?

ответ

1

Я не специалист по гравиям, но, похоже, следует использовать графический планировщик Грайля plugin.

Ниже вы можете найти рабочий код:

@Grab(group='org.quartz-scheduler', module='quartz', version='2.2.1') 

import org.quartz.*; 
import org.quartz.impl.StdSchedulerFactory; 

public class CronTriggerExample { 
    public static void main(String[] args) throws Exception { 

     def cronExpressions = ['0/5 * * * * ?', '0/10 * * * * ?', '0/20 * * * * ?'] 

     def triggers = cronExpressions.collect { cron -> 
      TriggerBuilder 
       .newTrigger() 
       .withIdentity("trigger-$cron", "trigger-$cron-group") 
       .withSchedule(CronScheduleBuilder.cronSchedule(cron)) 
       .usingJobData(new JobDataMap(['cron': cron])) 
       .build() 
     } 

     Scheduler scheduler = new StdSchedulerFactory().getScheduler() 
     scheduler.start() 

     triggers.each { trigger -> 
      def job = JobBuilder.newJob(HelloJob).withIdentity("$trigger.key.name-job", "$trigger.key.name-job-group").build() 
      scheduler.scheduleJob(job, trigger) 
     } 
     while(true){} 
    } 
} 

public class HelloJob implements Job { 
    public void execute(JobExecutionContext context) throws JobExecutionException { 
     println "Hello Quartz with cron: ${context.mergedJobDataMap.getString('cron')}" 
    } 
} 

название работы, группа рабочих мест, а также вызвать имя, триггер группы должно быть уникальным. Другие объекты могут быть переданы с JobDataMap. Теперь ясно?

+0

привет опал спасибо много снова :) Я мог бы получить несколько триггеров исправлено уже .. Основная проблема, с которой я сталкиваюсь, - это то, что jobDataMap передает конкретные параметры каждому триггеру, прежде чем планировать их. Пожалуйста, взгляните на новый код. – elyon

+0

Вы можете сказать спасибо с помощью upvoting :) Вы можете передать другие объекты с помощью 'usingJobData' при создании триггера - см. Пример, который я предоставил. – Opal

+0

Или .. со следующим фрагментом кода: 'triggerList [j] .jobDataMap.put ('params', ['some', 'list']'. См. API: http://quartz-scheduler.org/ api/2.2.0/org/quartz/JobDataMap.html – Opal

Смежные вопросы