如何运行多个石英作业

时间:2014-08-17 07:57:29

标签: java quartz-scheduler

要求是能够使用Quartz动态调度作业。在查看Web上的示例后,我发现大多数示例都是静态调度。我想在循环中创建石英作业。目前只有一个作业正在运行。请帮我。我的代码如下:

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

1 个答案:

答案 0 :(得分:0)

我建议通过数据库管理你的工作,万一你的服务器重新启动你最好坚持动态创建的石英工作。

这是一个例子

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

完整的源代码可以在这里找到:Job scheduling with Quartz example