TimerFSRecoveryThread.java

  1. /*
  2.  * GovWay - A customizable API Gateway
  3.  * https://govway.org
  4.  *
  5.  * Copyright (c) 2005-2025 Link.it srl (https://link.it).
  6.  *
  7.  * This program is free software: you can redistribute it and/or modify
  8.  * it under the terms of the GNU General Public License version 3, as published by
  9.  * the Free Software Foundation.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  18.  *
  19.  */
  20. package org.openspcoop2.monitor.engine.fs_recovery;

  21. import org.openspcoop2.core.commons.dao.DAOFactory;
  22. import org.openspcoop2.core.commons.dao.DAOFactoryProperties;
  23. import org.openspcoop2.monitor.engine.exceptions.EngineException;
  24. import org.openspcoop2.monitor.engine.config.MonitorProperties;
  25. import org.openspcoop2.monitor.engine.constants.CostantiConfigurazione;

  26. import java.sql.Connection;
  27. import java.sql.DriverManager;
  28. import java.util.ArrayList;
  29. import java.util.List;
  30. import java.util.Properties;

  31. import javax.sql.DataSource;

  32. import org.openspcoop2.core.config.OpenspcoopAppender;
  33. import org.openspcoop2.core.config.Property;
  34. import org.openspcoop2.core.config.utils.OpenSPCoopAppenderUtilities;
  35. import org.openspcoop2.generic_project.utils.ServiceManagerProperties;
  36. import org.openspcoop2.protocol.engine.BasicProtocolFactory;
  37. import org.openspcoop2.protocol.engine.ProtocolFactoryManager;
  38. import org.openspcoop2.protocol.engine.constants.Costanti;
  39. import org.openspcoop2.protocol.sdk.ConfigurazionePdD;
  40. import org.openspcoop2.protocol.sdk.diagnostica.IDiagnosticProducer;
  41. import org.openspcoop2.protocol.sdk.dump.IDumpProducer;
  42. import org.openspcoop2.protocol.sdk.tracciamento.ITracciaProducer;
  43. import org.openspcoop2.utils.Utilities;
  44. import org.openspcoop2.utils.resources.GestoreJNDI;
  45. import org.openspcoop2.utils.resources.Loader;

  46. /**
  47.  * TimerFSRecoveryThread
  48.  *
  49.  * @author Poli Andrea (apoli@link.it)
  50.  * @author $Author$
  51.  * @version $Rev$, $Date$
  52.  */
  53. public class TimerFSRecoveryThread extends Thread{

  54.     /**
  55.      * Timeout che definisce la cadenza di avvio di questo timer.
  56.      */
  57.     private long timeout = 10; // ogni 10 secondi avvio il Thread
  58.    

  59.     /** Configurazione */
  60.     private FSRecoveryConfig fsRepositoryConfig;
  61.    
  62.     /** DataSource */
  63.     private DataSource ds;
  64.     private String dsJndiName;
  65.    
  66.     /** Connection */
  67.     private Connection connection;
  68.     private String connectionUrl = null;
  69.     private String connectionDriver = null;
  70.     private String connectionUsername = null;
  71.     private String connectionPassword = null;
  72.    
  73.     /** DAOFactory */
  74.     private DAOFactory daoFactory;
  75.     private ServiceManagerProperties daoFactoryServiceManagerPropertiesTransazioni = null;
  76.     private org.openspcoop2.core.transazioni.dao.IServiceManager transazioniSM = null;
  77.     private org.openspcoop2.core.eventi.dao.IServiceManager pluginsEventiSM = null;
  78.    
  79.     /** OpenSPCoopAppender */
  80.     private ITracciaProducer tracciamentoAppender;
  81.     private IDiagnosticProducer diagnosticoAppender;
  82.     private IDumpProducer dumpAppender;
  83.     private boolean transazioniRegistrazioneDumpHeadersCompactEnabled;
  84.    
  85.     // VARIABILE PER STOP
  86.     private boolean stop = false;
  87.    
  88.     public boolean isStop() {
  89.         return this.stop;
  90.     }

  91.     public void setStop(boolean stop) {
  92.         this.stop = stop;
  93.     }
  94.    
  95.    
  96.     /** Costruttore Datasource */
  97.     public TimerFSRecoveryThread(DataSource ds,
  98.             ITracciaProducer tracciamentoAppender,
  99.             IDiagnosticProducer diagnosticoAppender,
  100.             IDumpProducer dumpAppender, boolean transazioniRegistrazioneDumpHeadersCompactEnabled,
  101.             FSRecoveryConfig fsRepositoryConfig) throws EngineException{
  102.         this(fsRepositoryConfig);
  103.         this.ds = ds;
  104.         this.tracciamentoAppender = tracciamentoAppender;
  105.         this.diagnosticoAppender = diagnosticoAppender;
  106.         this.dumpAppender = dumpAppender;
  107.         this.transazioniRegistrazioneDumpHeadersCompactEnabled = transazioniRegistrazioneDumpHeadersCompactEnabled;
  108.     }
  109.     public TimerFSRecoveryThread(String ds,Properties dsContext, FSRecoveryConfig fsRepositoryConfig) throws EngineException{
  110.         this(fsRepositoryConfig);
  111.         GestoreJNDI jndi = new GestoreJNDI(dsContext);
  112.         try{
  113.             this.dsJndiName = ds;
  114.             this.ds = (DataSource) jndi.lookup(ds);
  115.         }catch(Exception e){
  116.             throw new EngineException(e.getMessage(),e);
  117.         }
  118.     }
  119.    
  120.     /** Costruttore Connection */
  121.     public TimerFSRecoveryThread(Connection connection,
  122.             ITracciaProducer tracciamentoAppender,
  123.             IDiagnosticProducer diagnosticoAppender,
  124.             IDumpProducer dumpAppender, boolean transazioniRegistrazioneDumpHeadersCompactEnabled,
  125.             OpenspcoopAppender appenderProperties, FSRecoveryConfig fsRepositoryConfig) throws EngineException{
  126.         this(fsRepositoryConfig);
  127.         this.connection = connection;
  128.         this.tracciamentoAppender = tracciamentoAppender;
  129.         this.diagnosticoAppender = diagnosticoAppender;
  130.         this.dumpAppender = dumpAppender;
  131.         this.transazioniRegistrazioneDumpHeadersCompactEnabled = transazioniRegistrazioneDumpHeadersCompactEnabled;
  132.     }
  133.     public TimerFSRecoveryThread(String connectionUrl,String driverJDBC,String username, String password, FSRecoveryConfig fsRepositoryConfig) throws EngineException{
  134.         this(fsRepositoryConfig);
  135.         try{
  136.             this.connectionUrl = connectionUrl;
  137.             this.connectionDriver = driverJDBC;
  138.             this.connectionUsername = username;
  139.             this.connectionPassword = password;
  140.             Class.forName(driverJDBC);
  141.             this.connection = DriverManager.getConnection(connectionUrl,username,password);
  142.         }catch(Exception e){
  143.             throw new EngineException(e.getMessage(),e);
  144.         }
  145.     }
  146.    
  147.     /** Costruttore */
  148.     public TimerFSRecoveryThread(FSRecoveryConfig fsRepositoryConfig) throws EngineException{
  149.    
  150.         try{
  151.        
  152.             MonitorProperties props = MonitorProperties.getInstance(fsRepositoryConfig.getLogCore());

  153.             try {
  154.                 this.timeout = Integer.parseInt(props.getProperty(CostantiConfigurazione.FS_RECOVERY_TIMEOUT, "10", true));
  155.             } catch (NumberFormatException e) {
  156.                 this.timeout=10;
  157.             }
  158.            
  159.             this.fsRepositoryConfig = fsRepositoryConfig;
  160.            
  161.             this.daoFactory = DAOFactory.getInstance(this.fsRepositoryConfig.getLogSql());
  162.             this.daoFactoryServiceManagerPropertiesTransazioni = DAOFactoryProperties.getInstance(this.fsRepositoryConfig.getLogSql()).getServiceManagerProperties(org.openspcoop2.core.transazioni.utils.ProjectInfo.getInstance());
  163.            
  164.         }catch(Exception e){
  165.             throw new EngineException(e.getMessage(),e);
  166.         }
  167.     }
  168.    
  169.     /**
  170.      * Metodo che fa partire il Thread.
  171.      *
  172.      */
  173.     @Override
  174.     public void run(){
  175.            
  176.         initResources();
  177.        
  178.         while(this.stop == false){
  179.            
  180.             FSRecoveryLibrary.generate(this.fsRepositoryConfig,
  181.                     this.daoFactory, this.fsRepositoryConfig.getLogSql(), this.daoFactoryServiceManagerPropertiesTransazioni,
  182.                     Costanti.GESTIONE_SERIALIZABLE_ATTESA_ATTIVA, Costanti.GESTIONE_SERIALIZABLE_CHECK_INTERVAL,
  183.                     this.transazioniSM,
  184.                     this.tracciamentoAppender, this.diagnosticoAppender,
  185.                     this.dumpAppender, this.transazioniRegistrazioneDumpHeadersCompactEnabled,
  186.                     this.pluginsEventiSM);
  187.                            
  188.             // CheckInterval
  189.             if(this.stop==false){
  190.                 int i=0;
  191.                 while(i<this.timeout){
  192.                     Utilities.sleep(1000);      
  193.                     if(this.stop){
  194.                         break; // thread terminato, non lo devo far piu' dormire
  195.                     }
  196.                     i++;
  197.                 }
  198.             }
  199.         }
  200.        
  201.         this.fsRepositoryConfig.getLogCore().info("Thread per il recovery da file system terminato");

  202.     }
  203.    
  204.     private void initResources(){
  205.        
  206.         if(this.fsRepositoryConfig.isRipristinoTransazioni()){
  207.             try{
  208.                
  209.                 if(this.ds!=null){
  210.                     this.transazioniSM = (org.openspcoop2.core.transazioni.dao.IServiceManager) this.daoFactory.getServiceManager(
  211.                             org.openspcoop2.core.transazioni.utils.ProjectInfo.getInstance(),
  212.                             this.ds);
  213.                 }
  214.                 else if(this.connection!=null){
  215.                     this.transazioniSM = (org.openspcoop2.core.transazioni.dao.IServiceManager) this.daoFactory.getServiceManager(
  216.                             org.openspcoop2.core.transazioni.utils.ProjectInfo.getInstance(),
  217.                             this.connection);
  218.                 }
  219.                 else{
  220.                     this.transazioniSM = (org.openspcoop2.core.transazioni.dao.IServiceManager) this.daoFactory.getServiceManager(
  221.                             org.openspcoop2.core.transazioni.utils.ProjectInfo.getInstance());
  222.                 }
  223.                
  224.             }catch(Exception e){
  225.                 this.fsRepositoryConfig.getLogCore().error("Errore durante l'inizializzazione del Service Manager per le transazioni: "+e.getMessage(),e);
  226.             }
  227.         }
  228.        
  229.         if(this.fsRepositoryConfig.isRipristinoEventi()){
  230.             try{
  231.                
  232.                 if(this.ds!=null){
  233.                     this.pluginsEventiSM = (org.openspcoop2.core.eventi.dao.IServiceManager) this.daoFactory.getServiceManager(
  234.                             org.openspcoop2.core.eventi.utils.ProjectInfo.getInstance(),
  235.                             this.ds);
  236.                 }
  237.                 else if(this.connection!=null){
  238.                     this.pluginsEventiSM = (org.openspcoop2.core.eventi.dao.IServiceManager) this.daoFactory.getServiceManager(
  239.                             org.openspcoop2.core.eventi.utils.ProjectInfo.getInstance(),
  240.                             this.connection);
  241.                 }
  242.                 else{
  243.                     this.pluginsEventiSM = (org.openspcoop2.core.eventi.dao.IServiceManager) this.daoFactory.getServiceManager(
  244.                             org.openspcoop2.core.eventi.utils.ProjectInfo.getInstance());
  245.                 }
  246.                
  247.             }catch(Exception e){
  248.                 this.fsRepositoryConfig.getLogCore().error("Errore durante l'inizializzazione del Service Manager per i plugins eventi: "+e.getMessage(),e);
  249.             }
  250.         }
  251.        
  252.         if(this.fsRepositoryConfig.isRipristinoTransazioni() &&
  253.                 (this.tracciamentoAppender==null || this.diagnosticoAppender==null)){
  254.        
  255.             try{
  256.            
  257.                 ConfigurazionePdD configPdD = new ConfigurazionePdD();
  258.                 configPdD.setAttesaAttivaJDBC(-1);
  259.                 configPdD.setCheckIntervalJDBC(-1);
  260.                 configPdD.setLoader(new Loader(this.getClass().getClassLoader()));
  261.                 configPdD.setLog(this.fsRepositoryConfig.getLogCore());
  262.                 ProtocolFactoryManager.initialize(this.fsRepositoryConfig.getLogCore(), configPdD, this.fsRepositoryConfig.getDefaultProtocol());
  263.                
  264.             }catch(Exception e){
  265.                 this.fsRepositoryConfig.getLogCore().error("Errore durante l'inizializzazione del ProtocolFactoryManager: "+e.getMessage(),e);
  266.             }
  267.        
  268.         }
  269.            
  270.         if(this.fsRepositoryConfig.isRipristinoTransazioni() && this.tracciamentoAppender==null){
  271.            
  272.             try{
  273.            
  274.                 // Init
  275.                 this.tracciamentoAppender = new BasicProtocolFactory(this.fsRepositoryConfig.getLogCore()).createTracciaProducer();
  276.                 OpenspcoopAppender tracciamentoOpenSPCoopAppender = new OpenspcoopAppender();
  277.                 tracciamentoOpenSPCoopAppender.setTipo("__threadLibraryFileSystemRecovery");
  278.                 List<Property> tracciamentoOpenSPCoopAppenderProperties = new ArrayList<Property>();

  279.                 this.addParameters(tracciamentoOpenSPCoopAppenderProperties);

  280.                 tracciamentoOpenSPCoopAppender.setPropertyList(tracciamentoOpenSPCoopAppenderProperties);
  281.                 this.tracciamentoAppender.initializeAppender(tracciamentoOpenSPCoopAppender);
  282.                 this.tracciamentoAppender.isAlive();
  283.                
  284.             }catch(Exception e){
  285.                 this.fsRepositoryConfig.getLogCore().error("Errore durante l'inizializzazione del TracciamentoAppender: "+e.getMessage(),e);
  286.             }
  287.         }
  288.        
  289.         if(this.fsRepositoryConfig.isRipristinoTransazioni() && this.diagnosticoAppender==null){
  290.            
  291.             try{
  292.                            
  293.                 // Init
  294.                 this.diagnosticoAppender = new BasicProtocolFactory(this.fsRepositoryConfig.getLogCore()).createDiagnosticProducer();
  295.                 OpenspcoopAppender diagnosticoOpenSPCoopAppender = new OpenspcoopAppender();
  296.                 diagnosticoOpenSPCoopAppender.setTipo("__threadLibraryFileSystemRecovery");
  297.                 List<Property> diagnosticoOpenSPCoopAppenderProperties = new ArrayList<Property>();

  298.                 this.addParameters(diagnosticoOpenSPCoopAppenderProperties);

  299.                 diagnosticoOpenSPCoopAppender.setPropertyList(diagnosticoOpenSPCoopAppenderProperties);
  300.                 this.diagnosticoAppender.initializeAppender(diagnosticoOpenSPCoopAppender);
  301.                 this.diagnosticoAppender.isAlive();
  302.                
  303.             }catch(Exception e){
  304.                 this.fsRepositoryConfig.getLogCore().error("Errore durante l'inizializzazione del DiagnosticoAppender: "+e.getMessage(),e);
  305.             }
  306.         }
  307.        
  308.         if(this.fsRepositoryConfig.isRipristinoTransazioni() && this.dumpAppender==null){
  309.            
  310.             try{
  311.                            
  312.                 // Init
  313.                 this.dumpAppender = new BasicProtocolFactory(this.fsRepositoryConfig.getLogCore()).createDumpProducer();
  314.                 OpenspcoopAppender dumpOpenSPCoopAppender = new OpenspcoopAppender();
  315.                 dumpOpenSPCoopAppender.setTipo("__threadLibraryFileSystemRecovery");
  316.                 List<Property> dumpOpenSPCoopAppenderProperties = new ArrayList<Property>();

  317.                 this.addParameters(dumpOpenSPCoopAppenderProperties);

  318.                 dumpOpenSPCoopAppender.setPropertyList(dumpOpenSPCoopAppenderProperties);
  319.                 this.diagnosticoAppender.initializeAppender(dumpOpenSPCoopAppender);
  320.                 this.diagnosticoAppender.isAlive();
  321.                
  322.             }catch(Exception e){
  323.                 this.fsRepositoryConfig.getLogCore().error("Errore durante l'inizializzazione del DiagnosticoAppender: "+e.getMessage(),e);
  324.             }
  325.         }
  326.     }
  327.    
  328.     private void addParameters(List<Property> appenderProperties) throws Exception{
  329.         DAOFactoryProperties daoFactoryProperties = DAOFactoryProperties.getInstance(this.fsRepositoryConfig.getLogSql());
  330.         String tipoDatabase = daoFactoryProperties.getTipoDatabase(org.openspcoop2.core.transazioni.utils.ProjectInfo.getInstance());
  331.        
  332.         String dsJndiName = null;
  333.         String connectionUrl = null;
  334.         String connectionDriver = null;
  335.         String connectionUsername = null;
  336.         String connectionPassword = null;
  337.         if(this.dsJndiName!=null){
  338.             dsJndiName = this.dsJndiName;
  339.         }
  340.         else if(this.connectionUrl!=null){
  341.             connectionUrl = this.connectionUrl;
  342.             connectionDriver = this.connectionDriver;
  343.             connectionUsername = this.connectionUsername;
  344.             connectionPassword = this.connectionPassword;
  345.         }
  346.         else{
  347.             if(daoFactoryProperties.isTipoAccessoTramiteDatasource(org.openspcoop2.core.transazioni.utils.ProjectInfo.getInstance())){
  348.                 dsJndiName = daoFactoryProperties.getDatasourceJNDIName(org.openspcoop2.core.transazioni.utils.ProjectInfo.getInstance());
  349.             }
  350.             else{
  351.                 connectionUrl = daoFactoryProperties.getConnectionUrl(org.openspcoop2.core.transazioni.utils.ProjectInfo.getInstance());
  352.                 connectionDriver = daoFactoryProperties.getConnectionDriverJDBC(org.openspcoop2.core.transazioni.utils.ProjectInfo.getInstance());
  353.                 connectionUsername = daoFactoryProperties.getConnectionAuthUsername(org.openspcoop2.core.transazioni.utils.ProjectInfo.getInstance());
  354.                 connectionPassword = daoFactoryProperties.getConnectionAuthPassword(org.openspcoop2.core.transazioni.utils.ProjectInfo.getInstance());
  355.             }
  356.         }
  357.        
  358.         boolean debug = daoFactoryProperties.isShowSql(org.openspcoop2.core.transazioni.utils.ProjectInfo.getInstance());
  359.        
  360.         OpenSPCoopAppenderUtilities.addParameters(this.fsRepositoryConfig.getLogCore(), appenderProperties,
  361.                 dsJndiName,
  362.                 connectionUrl, connectionDriver, connectionUsername, connectionPassword,
  363.                 tipoDatabase,
  364.                 true, debug);
  365.        
  366.     }
  367. }