package in.partake.daemon; import in.partake.app.PartakeConfiguration; import java.util.ArrayList; import java.util.List; import java.util.Timer; import java.util.TimerTask; import play.Logger; class PartakeDaemonTask extends TimerTask { private final PartakeDaemon daemon; public PartakeDaemonTask(PartakeDaemon daemon) { this.daemon = daemon; } @Override public void run() { if (!PartakeConfiguration.isTwitterDaemonEnabled()) { Logger.debug("Twitter daemon task is disabled."); return; } for (IPartakeDaemonTask task: daemon.getTasks()) { Logger.info(task.getName() + " will start..."); try { task.run(); Logger.info(task.getName() + " has finished without an error."); } catch (Exception e) { Logger.error(task.getName() + " has encountered an error. This should be immediately fixed."); } } } } public class PartakeDaemon { private static final int TIMER_INTERVAL_IN_MILLIS = 30000; // 30 secs. TODO: magic number! private static PartakeDaemon instance = new PartakeDaemon(); private Timer timer; private List<IPartakeDaemonTask> tasks; public static PartakeDaemon getInstance() { return instance; } private PartakeDaemon() { timer = new Timer(); tasks = new ArrayList<IPartakeDaemonTask>(); } public void schedule() { Logger.info("Daemons are scheduling..."); // initial wait is required because application initialization might not be finished. timer.schedule(new PartakeDaemonTask(this), TIMER_INTERVAL_IN_MILLIS, TIMER_INTERVAL_IN_MILLIS); } public void cancel() { timer.cancel(); Logger.info("Scheduled twitter daemons have been cancelled."); } public void addTask(IPartakeDaemonTask task) { tasks.add(task); } public List<IPartakeDaemonTask> getTasks() { return tasks; } public void removeAllTasks() { tasks.clear(); } }