/* * This class was contributed by Andres Marques from Cabal Uruguay. * This class is very similar to our existing DailyTaskAdaptor, * the only difference in terms of functionality is that we don't * deal with periods other than 24hours in the DailyTaskAdaptor. * * We can either add that functionality to the existing * DailyTaskAdaptor or replace it by this stuff. We need to evaluate * pros and cons. * * There might be a minor bug there, the 'task' is not getting * unregistered at stop time. * * Sample Configuration: * ------------------------------------------------------------- <task-adaptor class="org.jpos.q2.iso.SchedulingTaskAdaptor" logger="Q2" realm="xxx" name="cierreLoteMovicom"> <class>uy.com.cabal.transactionality.movicom.MovicomCierreLote</class> <property name="delay" value="0"/> <!--property name="firstTime" value="01:00:00"/--> <property name="period" value="86400000"/> </task-adaptor> * ------------------------------------------------------------- * */ package org.jpos.q2.iso; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Timer; import java.util.TimerTask; import org.jpos.core.ConfigurationException; import org.jpos.util.NameRegistrar; /** * * @author amarqueslin */ public class SchedulingTaskAdaptor extends TaskAdaptor { private Timer timer = new Timer(); private Long delay; private Date firstTime; private long period; /** Creates a new instance of SchedulingTaskAdaptor */ public SchedulingTaskAdaptor() { } public class RunnableWrapper extends TimerTask { private Runnable innerRunnable; public RunnableWrapper(Runnable innerRunnable) { this.innerRunnable = innerRunnable; } public void run() { innerRunnable.run(); } } public void setConfiguration(org.jpos.core.Configuration cfg) throws org.jpos.core.ConfigurationException { super.setConfiguration(cfg); boolean daemon = cfg.getBoolean("daemon", true); if (daemon) { timer = new Timer(true); } period = cfg.getLong("period", 24 * 60 * 60 * 1000); //By default execute task every 24hs String initTimeInfo = ""; long delayLong = cfg.getLong("delay", -1); if (delayLong != -1) { delay = new Long(delayLong); initTimeInfo = "delay = " + delay; } else { String strFirstTime = cfg.get("firstTime", "00:00:00"); //By default start at 12 AM Date now = new Date(); if (strFirstTime.equals("now")) { firstTime = now; } else { SimpleDateFormat dateTimeFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); try { String today = dateFormat.format(now); Date time = dateTimeFormat.parse(today + " " + strFirstTime); if (time.after(now)) { firstTime = time; } else { firstTime = new Date(time.getTime() + 1000 * 60 * 60 * 24); } } catch (ParseException ex) { throw new ConfigurationException("The format in which to specify the first execution time is HH:mm:ss"); } initTimeInfo = "firstTime = " + dateTimeFormat.format(firstTime); } } String strConfig = "daemon = " + daemon + "\n" + initTimeInfo + "\n" + "period = " + period; log.info("Configuration", strConfig); } protected void startService() throws Exception { getServer().getFactory().setConfiguration(task, getPersist()); NameRegistrar.register (getName (), task); if (task instanceof TimerTask) { schedule((TimerTask) task); return; } if (task instanceof Runnable) { schedule(new RunnableWrapper((Runnable) task)); } } protected void schedule(TimerTask task) { if (delay != null) { timer.schedule(task, delay.longValue(), period); } else { timer.schedule(task, firstTime, period); } } protected void stopService() throws Exception { super.stopService(); timer.cancel(); } }