package org.srdbs.scheduler; import org.apache.log4j.Logger; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.Trigger; import org.quartz.impl.StdSchedulerFactory; import org.srdbs.core.DbConnect; import java.util.List; import static org.quartz.CronScheduleBuilder.*; import static org.quartz.JobBuilder.newJob; import static org.quartz.SimpleScheduleBuilder.simpleSchedule; import static org.quartz.TriggerBuilder.newTrigger; /** * Secure and Redundant Data Backup System. * User: Thilina Piyasundara * Date: 7/5/12 * Time: 1:03 PM * For more details visit : http://www.thilina.org */ public class RunScheduler { public static Logger logger = Logger.getLogger("systemsLog"); public static Logger backplogger = Logger.getLogger("backupLog"); private static Scheduler scheduler = null; public static void initSchedule() { try { List<Schedule> scheduleList = new DbConnect().getSchedule(); scheduler = StdSchedulerFactory.getDefaultScheduler(); scheduler.start(); //schedule of the messenger JobDetail messengerJob = newJob(RunMessageJob.class) .withIdentity("Messenger Job", "Daily backup group") .build(); Trigger messengerTrigger = newTrigger().withIdentity("Messenger Trigger", "Daily backup group") .startNow() .withSchedule(simpleSchedule() .withIntervalInMinutes(1) .repeatForever()) .build(); scheduler.scheduleJob(messengerJob, messengerTrigger); backplogger.info("Create messenger schedule to run in every 1 min."); //schedule for failed backups JobDetail failedBackupsJob = newJob(RunFailedBackupsJob.class) .withIdentity("Run Failed Backups Job", "Daily backup group") .build(); Trigger failedBackupsTrigger = newTrigger().withIdentity("Run Failed Backups Trigger", "Daily backup group") .startNow() .withSchedule(simpleSchedule() .withIntervalInMinutes(10) .repeatForever()) .build(); scheduler.scheduleJob(failedBackupsJob, failedBackupsTrigger); backplogger.info("Create failed backup schedule to run in every 10 min."); int count = 1; for (Schedule one : scheduleList) { backplogger.info("Schedule path : " + one.getLocation() + " and frequency : " + one.getFrequency()); Trigger trigger = null; JobDetail job = newJob(RunBackupJob.class) .withIdentity("Job " + count, "Daily backup group") .usingJobData("backupLocation", one.getLocation()) .usingJobData("compress", one.getCompress()) .usingJobData("encrypt", one.getEncrypt()) .build(); // if daily if (one.getFrequency() == 1) { backplogger.info("Creating the daily - backup trigger : " + one.getLocation() + " on schedule " + one.getStartHour() + ":" + one.getStartMin()); trigger = newTrigger().withIdentity("trigger " + count++, "Daily backup group") .startNow() .withSchedule(dailyAtHourAndMinute(one.getStartHour(), one.getStartMin())) .build(); scheduler.scheduleJob(job, trigger); // if weekly } else if (1 < one.getFrequency() && one.getFrequency() < 9) { backplogger.info("Creating weekly on " + (one.getFrequency() - 1) + " of the week - backup trigger : " + one.getLocation() + " on schedule " + one.getStartHour() + ":" + one.getStartMin()); trigger = newTrigger().withIdentity("trigger " + count++, "Daily backup group") .startNow() .withSchedule(weeklyOnDayAndHourAndMinute((one.getFrequency() - 1), one.getStartHour(), one.getStartMin())) .build(); scheduler.scheduleJob(job, trigger); // if monthly } else if (one.getFrequency() > 8) { backplogger.info("Creating monthly on day : " + (one.getFrequency() - 8) + " backup trigger : " + one.getLocation() + " on schedule " + one.getStartHour() + ":" + one.getStartMin()); trigger = newTrigger().withIdentity("trigger " + count++, "Daily backup group") .startNow() .withSchedule(monthlyOnDayAndHourAndMinute(one.getFrequency() - 8, one.getStartHour(), one.getStartMin())) .build(); scheduler.scheduleJob(job, trigger); } } } catch (Exception e) { backplogger.error("Error creating the job : " + e); } } public static void restartScheduler() { try { scheduler.shutdown(); backplogger.info("Stop the scheduler."); Thread.sleep(1000); } catch (Exception e) { backplogger.error("Error stopping the scheduler : " + e.getMessage()); } initSchedule(); } }