package com.fitbank.bpmserver; import com.fitbank.common.logger.FitbankLogger; import org.apache.commons.configuration.Configuration; import org.apache.log4j.Logger; /** * Interfaz que deben implementar los servicios de incializacion del server *

* Un servicio puede tener los siguientes comportamientos, segun la propiedad * especificada en fitserver.properties:

* * nombre.de.la.clase.executeOnStartup
* Indica si el servicio se ejecuta al iniciar el servidor (defautl: true) *

* nombre.de.la.clase.executeOnShutdown
* Indica si el servicio se ejecuta al parar el servidor (default: false) *

* nombre.de.la.clase.executeOnRuntime
* Indica si el servicio se ejecuta mientras el servidor este en ejecucion (default: false) *

* nombre.de.la.clase.executeByPeriods
* Indica si el servicio se ejecuta en periodos Requiere la propiedad period (default: false) *

* nombre.de.la.clase.period
* Indica los periodos de ejecucion del servicio (minutos) (default: 0). * * @author Soft WareHouse S.A. */ public abstract class ServiceBpm extends Thread { /** * Log por default. */ public static final Logger LOGGER = FitbankLogger.getLogger(); /** * Archivo de configuraciones para el servidor. */ private static final Configuration CONFIG = FitBpmServerParam.getConfig(); /** * Indica si esta corriendo o no el servicio. */ private boolean running = false; /** * Logica de ejecucion del servicio. */ public abstract void execute() throws Exception; /** * Procesos extras al interrumpir el servicio. */ public abstract void shutdown(); /** * Metodo de ejecucion hilo al iniciar el servidor. */ @Override public void run() { if (this.isExecuteOnStartup()) { this.setRunning(true); this.runThread(); } this.setRunning(false); } /** * Metodo de ejecucion del servicio. */ private void runThread() { LOGGER.info("Ejecutando del servicio " + this.getName() + "..."); while (this.isRunning()) { try { this.execute(); if (this.isExecuteByPeriods() && !this.isInterrupted()) { for (int i = 0; i < this.getPeriod(); i++) { if (!this.isRunning()) { break; } Thread.sleep(60 * 1000); } } else if (!this.isExecuteOnRuntime()){ LOGGER.info("Servicio " + this.getName() + " ejecutado una sola vez"); if (this.isExecuteOnStartup()) { this.interrupt(); } break; } } catch (InterruptedException e) { this.setRunning(false); LOGGER.info("Hilo " + this.getName() + " interrumpido", e); } catch (Exception e) { this.setRunning(false); LOGGER.error("Error desconocido en " + this.getName(), e); } } LOGGER.info("Ejecucion del servicio " + this.getName() + " terminada"); } /** * Metodo de ejecucion hilo al finalizar el servidor. */ @Override public void interrupt() { LOGGER.info("Finalizando servicio " + this.getName() + "..."); if (this.isExecuteOnShutdown()) { this.setRunning(true); this.runThread(); } this.setRunning(false); this.shutdown(); super.interrupt(); LOGGER.info("Servicio " + this.getName() + " finalizado completamente"); } /** * Indica si el servicio esta ejecutandose o no. */ public boolean isRunning() { return running; } /** * Indicar la ejecucion o finalizacion del servicio. */ public void setRunning(boolean running) { this.running = running; } /** * Indica si el servicio se ejecuta al iniciar el servidor. */ public boolean isExecuteOnStartup() { return CONFIG.getBoolean(this.getClass().getName() + ".executeOnStartup", true); } /** * Indica si el servicio se ejecuta al parar el servidor. */ public boolean isExecuteOnShutdown() { return CONFIG.getBoolean(this.getClass().getName() + ".executeOnShutdown", false); } /** * Indica si el servicio se ejecuta durante el tiempo de vida del servidor. */ public boolean isExecuteOnRuntime() { return CONFIG.getBoolean(this.getClass().getName() + ".executeOnRuntime", false); } /** * Indica si el servicio se ejecuta por periodos o una sola vez. */ public boolean isExecuteByPeriods() { return CONFIG.getBoolean(this.getClass().getName() + ".executeByPeriods", false); } /** * Indica el periodo de repeticion de ejecuciones. */ public Integer getPeriod() { return CONFIG.getInt(this.getClass().getName() + ".period", 0); } }