Suggest a feature
×

Welcome to TagMyCode

Please login or create account to add a snippet.
0
0
 
0
Language: Java
Posted by: Mauro Mazzocchetti
Added: Jul 26, 2018 9:09 AM
Views: 5
Base timer to be extended
  1. import java.util.Date;
  2. import java.util.logging.Level;
  3. import java.util.logging.Logger;
  4.  
  5. import javax.annotation.PostConstruct;
  6. import javax.annotation.Resource;
  7. import javax.ejb.ScheduleExpression;
  8. import javax.ejb.Timeout;
  9. import javax.ejb.Timer;
  10. import javax.ejb.TimerConfig;
  11. import javax.ejb.TimerService;
  12.  
  13. /**
  14.  *
  15.  * @author mmazzocchetti
  16.  */
  17. public abstract class BaseTimer {
  18.  
  19.         @Resource
  20.         private TimerService timerService;
  21.  
  22.         private final String name;
  23.  
  24.         private Logger logger;
  25.         private final String BASE_SCHEDULER = "scheduler.";
  26.  
  27.         /**
  28.          *
  29.          * @param name
  30.          */
  31.         public BaseTimer(String name) {
  32.                 this.name = name;
  33.         }
  34.  
  35.         /**
  36.          *
  37.          */
  38.         @PostConstruct
  39.         public void initTimer() {
  40.                 getLogger().info("Initialization...");
  41.  
  42.                 try {
  43.                         getLogger().info("Checking parameters...");
  44.                         if (checkParameters()) {
  45.                                 getLogger().info("Parameters check successfull");
  46.                         } else {
  47.                                 getLogger().info("Parameters check skipped");
  48.                         }
  49.                 } catch (Exception e) {
  50.                         getLogger().log(Level.SEVERE, "Error on parameters check: " + e.getMessage(), e);
  51.                         return;
  52.                 }
  53.  
  54.                 try {
  55.                         if (isEnabled()) {
  56.                                 setTimer();
  57.                                 getLogger().info("Initialized...");
  58.                         } else {
  59.                                 getLogger().info("Initialized (as disabled)...");
  60.                         }
  61.                 } catch (Exception e) {
  62.                         getLogger().log(Level.SEVERE, "Error on get properties timer: " + e.getMessage(), e);
  63.                         return;
  64.                 }
  65.  
  66.         }
  67.  
  68.         private void setTimer() throws Exception {
  69.                 getLogger().fine("Setting a programmatic timeout every " + getSeconds() + " seconds for " + name + ".");
  70.                 ScheduleExpression scheduleExpression = new ScheduleExpression();
  71.                 scheduleExpression.second(getSeconds());
  72.                 scheduleExpression.minute(getMinutes());
  73.                 scheduleExpression.hour(getHours());
  74.                 scheduleExpression.dayOfWeek(getDayOfTheWeek());
  75.                 scheduleExpression.month(getMonth());
  76.                 timerService.createCalendarTimer(scheduleExpression, new TimerConfig(name, false));
  77.         }
  78.  
  79.         /**
  80.          *
  81.          * @param timer
  82.          */
  83.         @Timeout
  84.         public void timerTick(Timer timer) {
  85.                 getLogger().fine("Timer tick - Start");
  86.                 executeTick();
  87.                 getLogger().fine("Timer tick - End");
  88.         }
  89.  
  90.         /**
  91.          *
  92.          * @return
  93.          */
  94.         protected Logger getLogger() {
  95.                 if (logger == null) {
  96.                         logger = Logger.getLogger(this.getClass().getName());
  97.                 }
  98.                 return logger;
  99.         }
  100.  
  101.         /**
  102.          *
  103.          */
  104.         protected void removeTimer() {
  105.                 if (timerService.getTimers() != null) {
  106.                         for (Timer timer : timerService.getTimers()) {
  107.                                 if (timer.getInfo().equals(name)) {
  108.                                         timer.cancel();
  109.                                         getLogger().info("Timer removed");
  110.                                 }
  111.                         }
  112.                 }
  113.         }
  114.  
  115.         private void executeTick() {
  116.                 try {
  117.  
  118.                         if (!isInOperationTime()) {
  119.                                 logger.fine("Out of operation time window...");
  120.                                 return;
  121.                         }
  122.  
  123.                         getLogger().fine("In operation time window...");
  124.  
  125.                         execute();
  126.  
  127.                 } catch (Exception e) {
  128.                         getLogger().log(Level.SEVERE, "Error on executeTick: " + e.getMessage(), e);
  129.                 }
  130.         }
  131.  
  132.         private boolean isInOperationTime() {
  133.  
  134.                 try {
  135.                         Date start;
  136.                         start = getStartOperationalTime();
  137.                         if (start == null) {
  138.                                 return true;
  139.                         }
  140.                         Date end = getEndOperationalTime();
  141.                         if (end == null) {
  142.                                 return true;
  143.                         }
  144.  
  145.                         Date actual = new Date();
  146.                         return start.before(actual) && end.after(actual);
  147.                 } catch (Exception ex) {
  148.                         getLogger().log(Level.SEVERE, "Error on executeTick, for operational time: ", ex);
  149.                         return false;
  150.                 }
  151.         }
  152.  
  153.         /**
  154.          *
  155.          * @return @throws Exception
  156.          */
  157.         protected boolean isEnabled() throws Exception {
  158.                 return getProperty(BASE_SCHEDULER + getTimerNameProperties() + ".enabled", "false").equalsIgnoreCase("true");
  159.         }
  160.  
  161.         /**
  162.          *
  163.          * @return @throws Exception
  164.          */
  165.         protected Date getStartOperationalTime() throws Exception {
  166.                 Date start;
  167.                 start = new Date();
  168.                 start = DateUtils.setHours(start, Integer.parseInt(getProperty(BASE_SCHEDULER + getTimerNameProperties() + ".starttime", "0")));
  169.                 start = DateUtils.setMinutes(start, 0);
  170.                 start = DateUtils.setSeconds(start, 0);
  171.                 return start;
  172.         }
  173.  
  174.         /**
  175.          *
  176.          * @return @throws Exception
  177.          */
  178.         protected Date getEndOperationalTime() throws Exception {
  179.                 Date end;
  180.                 end = new Date();
  181.                 end = DateUtils.setHours(end, Integer.parseInt(getProperty(BASE_SCHEDULER + getTimerNameProperties() + ".endtime", "0")));
  182.                 end = DateUtils.setMinutes(end, 0);
  183.                 end = DateUtils.setSeconds(end, 0);
  184.                 return end;
  185.         }
  186.  
  187.         /**
  188.          * Returns the default interval in milliseconds
  189.          *
  190.          * @return
  191.          * @throws java.lang.Exception
  192.          */
  193.         protected int getSeconds() throws Exception {
  194.                 int seconds;
  195.                 seconds = Integer.parseInt(getProperty(BASE_SCHEDULER + getTimerNameProperties() + ".seconds", "0"));
  196.                 return seconds;
  197.         }
  198.  
  199.         /**
  200.          *
  201.          * @return @throws Exception
  202.          */
  203.         protected int getMinutes() throws Exception {
  204.                 int minutes;
  205.                 minutes = Integer.parseInt(getProperty(BASE_SCHEDULER + getTimerNameProperties() + ".minutes", "0"));
  206.                 return minutes;
  207.         }
  208.  
  209.         /**
  210.          *
  211.          * @return @throws Exception
  212.          */
  213.         protected int getHours() throws Exception {
  214.                 int hours;
  215.                 hours = Integer.parseInt(getProperty(BASE_SCHEDULER + getTimerNameProperties() + ".hours", "0"));
  216.                 return hours;
  217.         }
  218.  
  219.         /**
  220.          *
  221.          * @return @throws Exception
  222.          */
  223.         protected int getDayOfTheWeek() throws Exception {
  224.                 int dayOfTheWeek;
  225.                 dayOfTheWeek = Integer.parseInt(getProperty(BASE_SCHEDULER + getTimerNameProperties() + ".day", "0"));
  226.                 return dayOfTheWeek;
  227.         }
  228.  
  229.         /**
  230.          *
  231.          * @return @throws Exception
  232.          */
  233.         protected int getMonth() throws Exception {
  234.                 int month;
  235.                 month = Integer.parseInt(getProperty(BASE_SCHEDULER + getTimerNameProperties() + ".month", "0"));
  236.                 return month;
  237.         }
  238.  
  239.         /**
  240.          *
  241.          * @return @throws Exception
  242.          */
  243.         protected int getMaxRetries() throws Exception {
  244.                 int retries;
  245.                 retries = Integer.parseInt(getProperty(BASE_SCHEDULER + getTimerNameProperties() + ".retries", "2"));
  246.                 return retries;
  247.         }
  248.  
  249.         /**
  250.          *
  251.          * Da implementare con recupero da file di properties o tabella in base
  252.          * alle esigenze
  253.          *
  254.          * @param key
  255.          * @param defaultValue
  256.          * @return Stringa recuperata da configurazione o valore di default
  257.          */
  258.         protected abstract String getProperty(String key, String defaultValue);
  259.  
  260.         /**
  261.          * Restituisce il nome del timer che verrà cercato nelle properties
  262.          *
  263.          * @return Nome della properties da cercare
  264.          */
  265.         protected abstract String getTimerNameProperties();
  266.  
  267.         /**
  268.          * Logiche di esecuzione al Tick del timer
  269.          */
  270.         protected abstract void execute();
  271.  
  272.         /**
  273.          * Effettua il check dei parametri. Implementazione opzionale, se vanno
  274.          * bene eventuali valori di default inserire un return true;
  275.          *
  276.          *
  277.          * @return Ritorna false se i parametri non sono stati verificati, true
  278.          * altrimenti
  279.          * @throws Exception
  280.          */
  281.         protected abstract boolean checkParameters() throws Exception;
  282. }
  283.