2021-01-07 11:34:56 +07:00

79 lines
2.0 KiB
Java

package com.jasamedika.medifirst2000.asynctask;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class YearlyTimer {
private final static Logger LOGGER = LoggerFactory.getLogger(YearlyTimer.class);
// What to do
private final Runnable whatToDo;
// when
private final int dayOfMonth;
private final int hourOfDay;
// The current timer
private Timer current = new Timer();
public void cancelCurrent() {
LOGGER.info("YearlyTimer : Cancel current execution");
current.cancel();
LOGGER.info("YearlyTimer : Removes the timertask so it can be garbage collected");
current.purge();
}
public static YearlyTimer schedule(Runnable runnable, int dayOfMonth, int hourOfDay) {
LOGGER.info("YearlyTimer : Create a new instance");
return new YearlyTimer(runnable, dayOfMonth, hourOfDay);
}
private YearlyTimer(Runnable runnable, int day, int hour) {
this.whatToDo = runnable;
this.dayOfMonth = day;
this.hourOfDay = hour;
schedule();
}
private void schedule() {
cancelCurrent();
LOGGER.info("YearlyTimer : Assigning a new instance of Timer, allow the previous Timer to be garbage collected");
current = new Timer();
current.schedule(new TimerTask() {
public void run() {
try {
LOGGER.info("YearlyTimer : Running schedule");
whatToDo.run();
} finally {
LOGGER.info("YearlyTimer : Schedule for the next year");
schedule();
}
}
}, nextDate());
}
private Date nextDate() {
Calendar runDate = Calendar.getInstance();
runDate.set(Calendar.MONTH, 5);
runDate.set(Calendar.DAY_OF_MONTH, dayOfMonth);
runDate.set(Calendar.HOUR_OF_DAY, hourOfDay);
runDate.set(Calendar.MINUTE, 0);
runDate.set(Calendar.SECOND, 0);
runDate.set(Calendar.MILLISECOND, 0);
runDate.add(Calendar.YEAR, 1);
LOGGER.info("YearlyTimer : Set to next year " + runDate.getTime());
return runDate.getTime();
}
}