package org.apache.solr.handler.dataimport.scheduler;
import java.util.ArrayList;
import java.util.List;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import java.util.TimerTask;
import it.sauronsoftware.cron4j.Scheduler;
public class SolrDataImportScheduleRunner {
private static final Logger logger = LoggerFactory.getLogger(SolrDataImportScheduleRunner.class);
private Scheduler cron;
private List<Timer> timers = new ArrayList<Timer>();
private SolrDataImportSchedule schedule;
public SolrDataImportScheduleRunner(SolrDataImportSchedule schedule) {
this.schedule = schedule;
}
/**
* Starts the schedule specified
*/
public void start() {
// ensure previous runs are cleared out just in case
this.stop();
logger.info("[DataImportScheduler] Starting Scheduler...");
this.cron = new Scheduler();
for (SolrDataImportScheduleHTTPTask task : this.schedule.getTasks()) {
// if cron is specified use the scheduler (cron4j)
if (task.getCron() != null && task.getCron().isEmpty() == false) {
logger.info("[DataImportScheduler] Creating CRON Based DataImportHandler");
cron.schedule(task.getCron(), new SolrDataImportScheduleHTTPTaskRunner(task));
} else if (task.getSeconds() > 0) {
logger.info("[DataImportScheduler] Creating Timer Based DataImportHandler");
// schedule via timer for seconds
timers.add(createTaskTimer(task));
} else {
logger.error("[DataImportScheduler] Could not create DataImportHandler scheduler, does not have cron or second attribute defined!");
}
}
// start cron job
this.cron.start();
}
/**
* Stops all running jobs and request they be canceled
*/
public void stop() {
if (this.cron != null) {
this.cron.stop();
this.cron = null;
}
for (Timer t : this.timers) {
if (t != null) {
t.cancel();
}
}
this.timers = new ArrayList<Timer>();
}
/**
* Creates a new timer based job capable of executing every X number of seconds
*/
private static Timer createTaskTimer(SolrDataImportScheduleHTTPTask task) {
Timer timer = new Timer();
TimerTask r = new SolrDataImportScheduleHTTPTaskRunner(task);
int interval = task.getSeconds();
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.SECOND, interval);
Date startTime = calendar.getTime();
timer.scheduleAtFixedRate(r, startTime, 1000 * interval);
return timer;
}
}