简体   繁体   中英

How to run multiple quartz jobs

The requirements were, to be able to dynamically schedule jobs using Quartz. After looking at examples on the web I found most of the examples were of static scheduling. I want to create quartz job within a loop. Currently only one job is running. Please help me. My code is given below

while (iterator.hasNext()) {

    JSONObject obj =iterator.next();
    ISocialMediaPoller socialMediaObj=socialMeadiaObj.getPoller(obj);

    String jobName = (String)obj.get("NAME");
    // long rpo =(Long)obj.get("RPO");
    JobDetail job = new JobDetail();
    job.setName(jobName);
    job.setJobClass(Pollersheduller.class);

    //configure the scheduler time
    SimpleTrigger trigger = new SimpleTrigger();
    trigger.setName(jobName);
    trigger.setStartTime(new Date(System.currentTimeMillis() + 1000));
    trigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
    trigger.setRepeatInterval(12345);
    // socialMediaObj.execute();
    //schedule it
    Scheduler scheduler = new StdSchedulerFactory().getScheduler();
    scheduler.getContext().put("socialMediaObj", socialMediaObj);
    scheduler.start();
    scheduler.scheduleJob(job, trigger);                    
}

public void execute(JobExecutionContext context) throws JobExecutionException {
    // TODO Auto-generated method stub
    SchedulerContext schedulerContext = null;
    try {
        schedulerContext = context.getScheduler().getContext();
        ISocialMediaPoller socialMediaObj=   
            (ISocialMediaPoller)schedulerContext.get("socialMediaObj");
        socialMediaObj.execute();
    } catch (SchedulerException e1) {
        e1.printStackTrace();
}

I would suggest managing your jobs through the db , in case your server restarts you better persist the dynamically created quartz jobs.

Here is an example

@Service public class PersistentJobSchedulerJob {

private static Logger logger = Logger.getLogger("PersistentJobSchedulerJob");

@Autowired
private JobRepository jobRepository;

@Autowired
private MailService mailService;

@SuppressWarnings({ "rawtypes", "unchecked" })
@Scheduled(fixedRate=30000)
public void schedulePersistentJobs(){
    List<JobData> jobsData= jobRepository.findAll();
    logger.info("Retriving Jobs from Database and Scheduling One by One | Total Number of Jobs: "+jobsData.size());
    try{
        Scheduler scheduler = new StdSchedulerFactory().getScheduler(); 
        scheduler.start();  
        for(JobData jobData: jobsData){
            JobDetail job = newJob(MailSenderJob.class)
                            .withIdentity(jobData.getJobName())
                            .usingJobData(getJobDataMap(jobData))
                            .build();
            if(!jobData.getActive()){
                logger.info("Deleting a Job");
                scheduler.deleteJob(new JobKey(jobData.getJobName()));
                continue;
            }
            if(scheduler.checkExists(new JobKey(jobData.getJobName()))){
                logger.info("Rescheduling the Job");
                Trigger oldTrigger = scheduler.getTrigger(new TriggerKey(jobData.getJobName()+"Trigger"));
                TriggerBuilder tb = oldTrigger.getTriggerBuilder();
                Trigger newTrigger = tb.withSchedule(simpleSchedule()
                          .withIntervalInMilliseconds(jobData.getRepeatInterval()).
                          repeatForever())
                          .build();

                scheduler.rescheduleJob(oldTrigger.getKey(), newTrigger);
            }else{
                logger.info("Scheduling the Job");
                scheduler.scheduleJob(job,getTrigger(jobData));
            }
        }
    }catch (SchedulerException e) {
        logger.error("Scheduler Exception : "+e.getMessage());  
    }
}

private JobDataMap getJobDataMap(JobData jobData) {
    JobDataMap jobDataMap =  new JobDataMap();
    jobDataMap.put("recipients", jobData.getRecipients());
    jobDataMap.put("mailService", mailService);
    return jobDataMap;
}

private Trigger getTrigger(JobData jobData){
    SimpleTrigger simpleTrigger = newTrigger().withIdentity(jobData.getJobName()+"Trigger")
                                    .startAt(jobData.getStartDateTime())
                                    .withSchedule(simpleSchedule()
                                      .withIntervalInMilliseconds(jobData.getRepeatInterval()).
                                      repeatForever())
                                      .build();
    return simpleTrigger;
} }

The full source code can be found here: Job scheduling with Quartz example

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM