簡體   English   中英

如何運行多個石英作業

[英]How to run multiple quartz jobs

要求是能夠使用Quartz動態調度作業。 在網上查看示例后,我發現大多數示例都是靜態調度的。 我想在一個循環中創建石英作業。 當前只有一項作業正在運行。 請幫我。 我的代碼如下

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

我建議您通過db管理您的作業,以防服務器重新啟動,您最好保留動態創建的石英作業。

這是一個例子

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

完整的源代碼可以在這里找到: 用Quartz示例進行作業調度

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM