TimerMonitoraggioRisorseThread.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.pdd.timers;

  21. import java.io.ByteArrayOutputStream;
  22. import java.util.List;

  23. import org.openspcoop2.core.commons.CoreException;
  24. import org.openspcoop2.core.eventi.Evento;
  25. import org.openspcoop2.core.eventi.constants.CodiceEventoStatoGateway;
  26. import org.openspcoop2.core.eventi.constants.TipoEvento;
  27. import org.openspcoop2.core.eventi.constants.TipoSeverita;
  28. import org.openspcoop2.core.eventi.utils.SeveritaConverter;
  29. import org.openspcoop2.pdd.config.ClassNameProperties;
  30. import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
  31. import org.openspcoop2.pdd.config.DBManager;
  32. import org.openspcoop2.pdd.config.DBTransazioniManager;
  33. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  34. import org.openspcoop2.pdd.config.QueueManager;
  35. import org.openspcoop2.pdd.core.CostantiPdD;
  36. import org.openspcoop2.pdd.core.FileSystemSerializer;
  37. import org.openspcoop2.pdd.core.eventi.GestoreEventi;
  38. import org.openspcoop2.pdd.logger.MsgDiagnosticiProperties;
  39. import org.openspcoop2.pdd.logger.MsgDiagnostico;
  40. import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
  41. import org.openspcoop2.pdd.services.OpenSPCoop2Startup;
  42. import org.openspcoop2.protocol.engine.ProtocolFactoryManager;
  43. import org.openspcoop2.protocol.manifest.constants.ServiceBinding;
  44. import org.openspcoop2.protocol.registry.RegistroServiziManager;
  45. import org.openspcoop2.protocol.sdk.diagnostica.IDiagnosticProducer;
  46. import org.openspcoop2.protocol.sdk.tracciamento.ITracciaProducer;
  47. import org.openspcoop2.utils.Utilities;
  48. import org.openspcoop2.utils.beans.WriteToSerializerType;
  49. import org.openspcoop2.utils.date.DateManager;
  50. import org.openspcoop2.utils.threads.BaseThread;
  51. import org.slf4j.Logger;

  52. /**
  53.  * Thread per la gestione del monitoraggio delle risorse
  54.  *
  55.  *  
  56.  * @author Poli Andrea (apoli@link.it)
  57.  * @author $Author$
  58.  * @version $Rev$, $Date$
  59.  */
  60. public class TimerMonitoraggioRisorseThread extends BaseThread{

  61.     private static TimerState state = TimerState.OFF; // abilitato in OpenSPCoop2Startup al momento dell'avvio
  62.    
  63.     public static TimerState getSTATE() {
  64.         return state;
  65.     }
  66.     public static void setSTATE(TimerState sTATE) {
  67.         state = sTATE;
  68.     }

  69.     /** Indicazione di risorse correttamente disponibili */
  70.     private static boolean risorseDisponibili = true;
  71.     private static void setRisorseDisponibili(boolean risorseDisponibili) {
  72.         TimerMonitoraggioRisorseThread.risorseDisponibili = risorseDisponibili;
  73.     }
  74.     public static boolean isRisorseDisponibili() {
  75.         return risorseDisponibili;
  76.     }

  77.     /** Motivo dell'errore */
  78.     private static Exception risorsaNonDisponibileEccezione = null;
  79.     public static Exception getRisorsaNonDisponibile() {
  80.         return risorsaNonDisponibileEccezione;
  81.     }
  82.     private static void setRisorsaNonDisponibile(Exception risorsaNonDisponibile) {
  83.         TimerMonitoraggioRisorseThread.risorsaNonDisponibileEccezione = risorsaNonDisponibile;
  84.         TimerMonitoraggioRisorseThread.risorseDisponibili =  false;
  85.     }

  86.     /** Variabile che indica il Nome del modulo dell'architettura di OpenSPCoop rappresentato da questa classe */
  87.     public static final String ID_MODULO = "MonitoraggioRisorse";
  88.      
  89.    
  90.     /** Properties Reader */
  91.     private OpenSPCoop2Properties propertiesReader;
  92.     /** MessaggioDiagnostico */
  93.     private MsgDiagnostico msgDiag;
  94.    
  95.     /** LastImage */
  96.     private boolean lastCheck = true;
  97.    
  98.     /** Logger per debug */
  99.     private Logger logger = null;
  100.     private void logDebug(String msg) {
  101.         if(this.logger!=null) {
  102.             this.logger.debug(msg);
  103.         }
  104.     }
  105.     private void logWarn(String msg) {
  106.         if(this.logger!=null) {
  107.             this.logger.warn(msg);
  108.         }
  109.     }
  110.    
  111.     /** Risorsa: DB di OpenSPCoop */
  112.     private DBManager dbManager=null;
  113.     /** Risorsa: JMS di OpenSPCoop */
  114.     private QueueManager queueManager=null;
  115.     /** Risorsa: Configurazione di OpenSPCoop */
  116.     private ConfigurazionePdDManager configPdDReader=null;
  117.     /** Risorsa: Registri dei Servizi di OpenSPCoop */
  118.     private RegistroServiziManager registriPdDReader=null;
  119.     /** Risorsa: Tracciamenti Personalizzati */
  120.     private List<ITracciaProducer> tracciamentiPersonalizzati=null;
  121.     private List<String> tipiTracciamentiPersonalizzati=null;
  122.     /** Risorsa: Transazioni di OpenSPCoop */
  123.     private DBTransazioniManager dbTransazioniManager=null;
  124.     /** Risorsa: MsgDiagnostici Personalizzati */
  125.     private List<IDiagnosticProducer> msgDiagnosticiPersonalizzati=null;
  126.     private List<String> tipiMsgDiagnosticiPersonalizzati=null;
  127.    
  128.     private GestoreEventi gestoreEventi;
  129.    
  130.     /** Costruttore
  131.      * @throws Exception */
  132.     public TimerMonitoraggioRisorseThread() throws Exception {
  133.         this.propertiesReader = OpenSPCoop2Properties.getInstance();
  134.        
  135.         this.msgDiag = MsgDiagnostico.newInstance(TimerMonitoraggioRisorseThread.ID_MODULO);
  136.         this.msgDiag.setPrefixMsgPersonalizzati(MsgDiagnosticiProperties.MSG_DIAG_TIMER_MONITORAGGIO_RISORSE);
  137.         this.msgDiag.addKeyword(CostantiPdD.KEY_TIMER_MONITORAGGIO_RISORSE, TimerMonitoraggioRisorseThread.ID_MODULO);
  138.        
  139.         this.logger = OpenSPCoop2Logger.getLoggerOpenSPCoopResources();
  140.         if(this.propertiesReader.isAbilitatoControlloRisorseDB()){
  141.             this.dbManager = DBManager.getInstance();
  142.         }
  143.         if(this.propertiesReader.isAbilitatoControlloRisorseJMS()){
  144.             this.queueManager = QueueManager.getInstance();
  145.         }
  146.         if(this.propertiesReader.isAbilitatoControlloRisorseConfigurazione() || this.propertiesReader.isAbilitatoControlloValidazioneSemanticaConfigurazione()){
  147.             this.configPdDReader = ConfigurazionePdDManager.getInstance();
  148.         }
  149.         if(this.propertiesReader.isAbilitatoControlloRisorseRegistriServizi() || this.propertiesReader.isAbilitatoControlloValidazioneSemanticaRegistriServizi()){
  150.             this.registriPdDReader = RegistroServiziManager.getInstance();
  151.         }
  152.         if(this.propertiesReader.isAbilitatoControlloRisorseTracciamentiPersonalizzati()){
  153.             this.tracciamentiPersonalizzati = OpenSPCoop2Logger.getLoggerTracciamentoOpenSPCoopAppender();
  154.             this.tipiTracciamentiPersonalizzati = OpenSPCoop2Logger.getTipoTracciamentoOpenSPCoopAppender();
  155.             if(!this.propertiesReader.isTransazioniUsePddRuntimeDatasource()) {
  156.                 this.dbTransazioniManager = DBTransazioniManager.getInstance();
  157.             }
  158.         }
  159.         if(this.propertiesReader.isAbilitatoControlloRisorseMsgDiagnosticiPersonalizzati()){
  160.             this.msgDiagnosticiPersonalizzati = OpenSPCoop2Logger.getLoggerMsgDiagnosticoOpenSPCoopAppender();
  161.             this.tipiMsgDiagnosticiPersonalizzati = OpenSPCoop2Logger.getTipoMsgDiagnosticoOpenSPCoopAppender();
  162.         }
  163.         if(this.propertiesReader.isControlloRisorseRegistrazioneEvento()) {
  164.             this.gestoreEventi = GestoreEventi.getInstance();
  165.         }      
  166.     }

  167.     @Override
  168.     public void process(){
  169.         // nop: ho ridefinito il metodo run
  170.     }
  171.    
  172.     @Override
  173.     public void run(){
  174.        
  175.         try {
  176.        
  177.             String sec = "secondi";
  178.             if(this.propertiesReader.getControlloRisorseCheckInterval() == 1)
  179.                 sec = "secondo";
  180.             this.msgDiag.addKeyword(CostantiPdD.KEY_TIMEOUT, this.propertiesReader.getControlloRisorseCheckInterval()+" "+sec);
  181.             this.msgDiag.logPersonalizzato("avvioEffettuato");
  182.            
  183.             String risorsaNonDisponibile = null;
  184.             while(!this.isStop()){
  185.                 boolean checkRisorseDisponibili = true;
  186.                
  187.                 // Controllo che il sistema non sia andando in shutdown
  188.                 if(OpenSPCoop2Startup.contextDestroyed){
  189.                     this.logger.error("["+TimerMonitoraggioRisorseThread.ID_MODULO+"] Rilevato sistema in shutdown");
  190.                     return;
  191.                 }
  192.                
  193.                 if(TimerState.ENABLED.equals(state)) {
  194.                
  195.                     String descrizione = null;
  196.                    
  197.                     // Messaggi diagnostici personalizzati
  198.                     // Controllo per prima per sapere se posso usare poi i msg diagnostici per segnalare problemi
  199.                     if(checkRisorseDisponibili && this.propertiesReader.isAbilitatoControlloRisorseMsgDiagnosticiPersonalizzati()){
  200.                         String tipoMsgDiagnostico = null;
  201.                         try{
  202.                             for(int i=0; i< this.tipiMsgDiagnosticiPersonalizzati.size(); i++){
  203.                                 tipoMsgDiagnostico = this.tipiMsgDiagnosticiPersonalizzati.get(i);
  204.                                 this.logDebug("Controllo MsgDiagnosticoPersonalizzato ["+tipoMsgDiagnostico+"] (iterazioni:"+this.propertiesReader.getNumeroIterazioniFalliteControlloRisorseMsgDiagnosticiPersonalizzati()+" checkInterval:"+this.propertiesReader.getIterazioniFalliteCheckIntervalControlloRisorseMsgDiagnosticiPersonalizzati()+")");
  205.                                 Throwable t = null;
  206.                                 for (int j = 0; j < this.propertiesReader.getNumeroIterazioniFalliteControlloRisorseMsgDiagnosticiPersonalizzati(); j++) {
  207.                                     try {
  208.                                         this.logDebug("MsgDiagnosticoPersonalizzato ["+tipoMsgDiagnostico+"] check '"+j+"' ...");
  209.                                         this.msgDiagnosticiPersonalizzati.get(i).isAlive();
  210.                                         this.logDebug("MsgDiagnosticoPersonalizzato ["+tipoMsgDiagnostico+"] check '"+j+"' ok");
  211.                                         t=null;
  212.                                         break;
  213.                                     }catch(Throwable tAlive) { // Volutamente Throwable
  214.                                         this.logDebug("MsgDiagnosticoPersonalizzato ["+tipoMsgDiagnostico+"] check '"+j+"' failed: "+tAlive.getMessage());
  215.                                         t = tAlive;
  216.                                         // faccio un altro tentativo
  217.                                         Utilities.sleep(this.propertiesReader.getIterazioniFalliteCheckIntervalControlloRisorseMsgDiagnosticiPersonalizzati());
  218.                                     }
  219.                                 }
  220.                                 if(t!=null) {
  221.                                     throw t;
  222.                                 }
  223.                             }
  224.                         }catch(Throwable e){ // Volutamente Throwable
  225.                             risorsaNonDisponibile = "[MessaggioDiagnosticoAppender "+tipoMsgDiagnostico+"]";
  226.                             TimerMonitoraggioRisorseThread.setRisorsaNonDisponibile(new CoreException(risorsaNonDisponibile+" "+e.getMessage(),e));
  227.                             this.logger.error(risorsaNonDisponibile+" "+e.getMessage(),e);
  228.                             descrizione = risorsaNonDisponibile+" "+e.getMessage();
  229.                             checkRisorseDisponibili = false;
  230.                         }
  231.                     }
  232.                     // Database
  233.                     if(checkRisorseDisponibili && this.propertiesReader.isAbilitatoControlloRisorseDB()){
  234.                         try{
  235.                             this.logDebug("Controllo Database (iterazioni:"+this.propertiesReader.getNumeroIterazioniFalliteControlloRisorseDB()+" checkInterval:"+this.propertiesReader.getIterazioniFalliteCheckIntervalControlloRisorseDB()+")");
  236.                             Throwable t = null;
  237.                             for (int j = 0; j < this.propertiesReader.getNumeroIterazioniFalliteControlloRisorseDB(); j++) {
  238.                                 try {
  239.                                     this.logDebug("Database check '"+j+"' ...");
  240.                                     this.dbManager.isAlive();
  241.                                     this.logDebug("Database check '"+j+"' ok");
  242.                                     t=null;
  243.                                     break;
  244.                                 }catch(Throwable tAlive) { // Volutamente Throwable
  245.                                     this.logDebug("Database check '"+j+"' failed: "+tAlive.getMessage());
  246.                                     t = tAlive;
  247.                                     // faccio un altro tentativo
  248.                                     Utilities.sleep(this.propertiesReader.getIterazioniFalliteCheckIntervalControlloRisorseDB());
  249.                                 }
  250.                             }
  251.                             if(t!=null) {
  252.                                 throw t;
  253.                             }  
  254.                         }catch(Throwable e){ // Volutamente Throwable
  255.                             risorsaNonDisponibile = "[Database]";
  256.                             TimerMonitoraggioRisorseThread.setRisorsaNonDisponibile(new CoreException(risorsaNonDisponibile+" "+e.getMessage(),e));
  257.                             this.logger.error(risorsaNonDisponibile+" "+e.getMessage(),e);
  258.                             descrizione = risorsaNonDisponibile+" "+e.getMessage();
  259.                             checkRisorseDisponibili = false;
  260.                         }
  261.                     }
  262.                     // JMS
  263.                     if(this.propertiesReader.isServerJ2EE()){
  264.                         if(checkRisorseDisponibili && this.propertiesReader.isAbilitatoControlloRisorseJMS()){
  265.                             try{
  266.                                 this.logDebug("Controllo BrokerJMS (iterazioni:"+this.propertiesReader.getNumeroIterazioniFalliteControlloRisorseJMS()+" checkInterval:"+this.propertiesReader.getIterazioniFalliteCheckIntervalControlloRisorseJMS()+")");
  267.                                 Throwable t = null;
  268.                                 for (int j = 0; j < this.propertiesReader.getNumeroIterazioniFalliteControlloRisorseJMS(); j++) {
  269.                                     try {
  270.                                         this.logDebug("BrokerJMS check '"+j+"' ...");
  271.                                         this.queueManager.isAlive();
  272.                                         this.logDebug("BrokerJMS check '"+j+"' ok");
  273.                                         t=null;
  274.                                         break;
  275.                                     }catch(Throwable tAlive) {
  276.                                         this.logDebug("BrokerJMS check '"+j+"' failed: "+tAlive.getMessage());
  277.                                         t = tAlive;
  278.                                         // faccio un altro tentativo
  279.                                         Utilities.sleep(this.propertiesReader.getIterazioniFalliteCheckIntervalControlloRisorseJMS());
  280.                                     }
  281.                                 }
  282.                                 if(t!=null) {
  283.                                     throw t;
  284.                                 }  
  285.                             }catch(Throwable e){ // Volutamente Throwable
  286.                                 risorsaNonDisponibile = "[Broker JMS]";
  287.                                 TimerMonitoraggioRisorseThread.setRisorsaNonDisponibile(new CoreException(risorsaNonDisponibile+" "+e.getMessage(),e));
  288.                                 this.logger.error(risorsaNonDisponibile+" "+e.getMessage(),e);
  289.                                 descrizione = risorsaNonDisponibile+" "+e.getMessage();
  290.                                 checkRisorseDisponibili = false;
  291.                             }
  292.                         }
  293.                     }
  294.                     // Configurazione
  295.                     if(checkRisorseDisponibili && this.propertiesReader.isAbilitatoControlloRisorseConfigurazione()){
  296.                         try{
  297.                             this.logDebug("Controllo Configurazione (iterazioni:"+this.propertiesReader.getNumeroIterazioniFalliteControlloRisorseConfigurazione()+" checkInterval:"+this.propertiesReader.getIterazioniFalliteCheckIntervalControlloRisorseConfigurazione()+")");
  298.                             Throwable t = null;
  299.                             for (int j = 0; j < this.propertiesReader.getNumeroIterazioniFalliteControlloRisorseConfigurazione(); j++) {
  300.                                 try {
  301.                                     this.logDebug("Configurazione check '"+j+"' ...");
  302.                                     this.configPdDReader.isAlive();
  303.                                     this.logDebug("Configurazione check '"+j+"' ok");
  304.                                     t=null;
  305.                                     break;
  306.                                 }catch(Throwable tAlive) {
  307.                                     this.logDebug("Configurazione check '"+j+"' failed: "+tAlive.getMessage());
  308.                                     t = tAlive;
  309.                                     // faccio un altro tentativo
  310.                                     Utilities.sleep(this.propertiesReader.getIterazioniFalliteCheckIntervalControlloRisorseConfigurazione());
  311.                                 }
  312.                             }
  313.                             if(t!=null) {
  314.                                 throw t;
  315.                             }  
  316.                         }catch(Throwable e){ // Volutamente Throwable
  317.                             risorsaNonDisponibile = "[Configurazione]";
  318.                             TimerMonitoraggioRisorseThread.setRisorsaNonDisponibile(new CoreException(risorsaNonDisponibile+" "+e.getMessage(),e));
  319.                             this.logger.error(risorsaNonDisponibile+" "+e.getMessage(),e);
  320.                             descrizione = risorsaNonDisponibile+" "+e.getMessage();
  321.                             checkRisorseDisponibili = false;
  322.                         }
  323.                     }
  324.                     // Configurazione, validazione semantica
  325.                     if(checkRisorseDisponibili && this.propertiesReader.isAbilitatoControlloValidazioneSemanticaConfigurazione()){
  326.                         try{
  327.                             this.logDebug("Controllo Validazione semantica della Configurazione");
  328.                             ClassNameProperties classNameReader = ClassNameProperties.getInstance();
  329.                             this.configPdDReader.validazioneSemantica(classNameReader.getConnettore(),
  330.                                     classNameReader.getMsgDiagnosticoOpenSPCoopAppender(),
  331.                                     classNameReader.getTracciamentoOpenSPCoopAppender(),
  332.                                     classNameReader.getDumpOpenSPCoopAppender(),
  333.                                     classNameReader.getAutenticazionePortaDelegata(), classNameReader.getAutenticazionePortaApplicativa(),
  334.                                     classNameReader.getAutorizzazionePortaDelegata(),classNameReader.getAutorizzazionePortaApplicativa(),
  335.                                     classNameReader.getAutorizzazioneContenutoPortaDelegata(),classNameReader.getAutorizzazioneContenutoPortaApplicativa(),
  336.                                     classNameReader.getIntegrazionePortaDelegata(),
  337.                                     classNameReader.getIntegrazionePortaApplicativa(),
  338.                                     true,
  339.                                     true,
  340.                                     true, null);
  341.                         }catch(Throwable e){ // Volutamente Throwable
  342.                             risorsaNonDisponibile = "[Validazione semantica della Configurazione]";
  343.                             TimerMonitoraggioRisorseThread.setRisorsaNonDisponibile(new CoreException(risorsaNonDisponibile+" "+e.getMessage(),e));
  344.                             this.logger.error(risorsaNonDisponibile+" "+e.getMessage(),e);
  345.                             descrizione = risorsaNonDisponibile+" "+e.getMessage();
  346.                             checkRisorseDisponibili = false;
  347.                         }
  348.                     }
  349.                     // Registro dei Servizi
  350.                     if(checkRisorseDisponibili && this.propertiesReader.isAbilitatoControlloRisorseRegistriServizi()){
  351.                         try{
  352.                             this.logDebug("Controllo Registri dei Servizi (iterazioni:"+this.propertiesReader.getNumeroIterazioniFalliteControlloRisorseRegistriServizi()+" checkInterval:"+this.propertiesReader.getIterazioniFalliteCheckIntervalControlloRisorseRegistriServizi()+")");
  353.                             Throwable t = null;
  354.                             for (int j = 0; j < this.propertiesReader.getNumeroIterazioniFalliteControlloRisorseRegistriServizi(); j++) {
  355.                                 try {
  356.                                     this.logDebug("Registri dei Servizi check '"+j+"' ...");
  357.                                     this.registriPdDReader.isAlive(this.propertiesReader.isControlloRisorseRegistriRaggiungibilitaTotale());
  358.                                     this.logDebug("Registri dei Servizi check '"+j+"' ok");
  359.                                     t=null;
  360.                                     break;
  361.                                 }catch(Throwable tAlive) { // Volutamente Throwable
  362.                                     this.logDebug("Registri dei Servizi check '"+j+"' failed: "+tAlive.getMessage());
  363.                                     t = tAlive;
  364.                                     // faccio un altro tentativo
  365.                                     Utilities.sleep(this.propertiesReader.getIterazioniFalliteCheckIntervalControlloRisorseRegistriServizi());
  366.                                 }
  367.                             }
  368.                             if(t!=null) {
  369.                                 throw t;
  370.                             }  
  371.                         }catch(Throwable e){ // Volutamente Throwable
  372.                             risorsaNonDisponibile = "[Registri dei Servizi]";
  373.                             TimerMonitoraggioRisorseThread.setRisorsaNonDisponibile(new CoreException(risorsaNonDisponibile+" "+e.getMessage(),e));
  374.                             this.logger.error(risorsaNonDisponibile+" "+e.getMessage(),e);
  375.                             descrizione = risorsaNonDisponibile+" "+e.getMessage();
  376.                             checkRisorseDisponibili = false;
  377.                         }
  378.                     }
  379.                     // Registro dei Servizi, validazione semantica
  380.                     if(checkRisorseDisponibili && this.propertiesReader.isAbilitatoControlloValidazioneSemanticaRegistriServizi()){
  381.                         try{
  382.                             ProtocolFactoryManager pFactoryManager = ProtocolFactoryManager.getInstance();
  383.                             this.logDebug("Controllo Validazione semantica del Registri dei Servizi");
  384.                             this.registriPdDReader.validazioneSemantica(this.propertiesReader.isControlloRisorseRegistriRaggiungibilitaTotale(),
  385.                                     this.propertiesReader.isValidazioneSemanticaRegistroServiziCheckURI(),
  386.                                     pFactoryManager.getOrganizationTypesAsArray(),
  387.                                     pFactoryManager.getServiceTypesAsArray(ServiceBinding.SOAP),
  388.                                     pFactoryManager.getServiceTypesAsArray(ServiceBinding.REST),
  389.                                     ClassNameProperties.getInstance().getConnettore(),
  390.                                     true,
  391.                                     true,
  392.                                     null);
  393.                         }catch(Throwable e){ // Volutamente Throwable
  394.                             risorsaNonDisponibile = "[Validazione semantica del Registri dei Servizi]";
  395.                             TimerMonitoraggioRisorseThread.setRisorsaNonDisponibile(new CoreException(risorsaNonDisponibile+" "+e.getMessage(),e));
  396.                             this.logger.error(risorsaNonDisponibile+" "+e.getMessage(),e);
  397.                             descrizione = risorsaNonDisponibile+" "+e.getMessage();
  398.                             checkRisorseDisponibili = false;
  399.                         }
  400.                     }
  401.                     // Tracciamenti personalizzati
  402.                     if(checkRisorseDisponibili && this.propertiesReader.isAbilitatoControlloRisorseTracciamentiPersonalizzati()){
  403.                         String tipoTracciamento = null;
  404.                         try{
  405.                             for(int i=0; i< this.tipiTracciamentiPersonalizzati.size(); i++){
  406.                                 tipoTracciamento = this.tipiTracciamentiPersonalizzati.get(i);
  407.                                 this.logDebug("Controllo TracciamentoPersonalizzato ["+tipoTracciamento+"] (iterazioni:"+this.propertiesReader.getNumeroIterazioniFalliteControlloRisorseTracciamentiPersonalizzati()+" checkInterval:"+this.propertiesReader.getIterazioniFalliteCheckIntervalControlloRisorseTracciamentiPersonalizzati()+")");
  408.                                 Throwable t = null;
  409.                                 for (int j = 0; j < this.propertiesReader.getNumeroIterazioniFalliteControlloRisorseTracciamentiPersonalizzati(); j++) {
  410.                                     try {
  411.                                         this.logDebug("TracciamentoPersonalizzato ["+tipoTracciamento+"] check '"+j+"' ...");
  412.                                         this.tracciamentiPersonalizzati.get(i).isAlive();
  413.                                         this.logDebug("TracciamentoPersonalizzato ["+tipoTracciamento+"] check '"+j+"' ok");
  414.                                         t=null;
  415.                                         break;
  416.                                     }catch(Throwable tAlive) { // Volutamente Throwable
  417.                                         this.logDebug("TracciamentoPersonalizzato ["+tipoTracciamento+"] check '"+j+"' failed: "+tAlive.getMessage());
  418.                                         t = tAlive;
  419.                                         // faccio un altro tentativo
  420.                                         Utilities.sleep(this.propertiesReader.getIterazioniFalliteCheckIntervalControlloRisorseTracciamentiPersonalizzati());
  421.                                     }
  422.                                 }
  423.                                 if(t!=null) {
  424.                                     throw t;
  425.                                 }
  426.                             }
  427.                         }catch(Throwable e){ // Volutamente Throwable
  428.                             risorsaNonDisponibile = "[TracciamentoAppender "+tipoTracciamento+"]";
  429.                             TimerMonitoraggioRisorseThread.setRisorsaNonDisponibile(new CoreException(risorsaNonDisponibile+" "+e.getMessage(),e));
  430.                             this.logger.error(risorsaNonDisponibile+" "+e.getMessage(),e);
  431.                             descrizione = risorsaNonDisponibile+" "+e.getMessage();
  432.                             checkRisorseDisponibili = false;
  433.                         }
  434.                        
  435.                         // nel tracciamento considero anche le transazioni
  436.                         if(checkRisorseDisponibili && this.propertiesReader.isTransazioniUsePddRuntimeDatasource()==false) {
  437.                             try{
  438.                                 this.logDebug("Controllo Database Transazioni (iterazioni:"+this.propertiesReader.getNumeroIterazioniFalliteControlloRisorseTracciamentiPersonalizzati()+" checkInterval:"+this.propertiesReader.getIterazioniFalliteCheckIntervalControlloRisorseTracciamentiPersonalizzati()+")");
  439.                                 Throwable t = null;
  440.                                 for (int j = 0; j < this.propertiesReader.getNumeroIterazioniFalliteControlloRisorseTracciamentiPersonalizzati(); j++) {
  441.                                     try {
  442.                                         this.logDebug("Database Transazioni check '"+j+"' ...");
  443.                                         this.dbTransazioniManager.isAlive();
  444.                                         this.logDebug("Database Transazioni check '"+j+"' ok");
  445.                                         t=null;
  446.                                         break;
  447.                                     }catch(Throwable tAlive) { // Volutamente Throwable
  448.                                         this.logDebug("Database Transazioni check '"+j+"' failed: "+tAlive.getMessage());
  449.                                         t = tAlive;
  450.                                         // faccio un altro tentativo
  451.                                         Utilities.sleep(this.propertiesReader.getIterazioniFalliteCheckIntervalControlloRisorseTracciamentiPersonalizzati());
  452.                                     }
  453.                                 }
  454.                                 if(t!=null) {
  455.                                     throw t;
  456.                                 }
  457.                             }catch(Throwable e){ // Volutamente Throwable
  458.                                 risorsaNonDisponibile = "[DatabaseTransazioni]";
  459.                                 TimerMonitoraggioRisorseThread.setRisorsaNonDisponibile(new CoreException(risorsaNonDisponibile+" "+e.getMessage(),e));
  460.                                 this.logger.error(risorsaNonDisponibile+" "+e.getMessage(),e);
  461.                                 descrizione = risorsaNonDisponibile+" "+e.getMessage();
  462.                                 checkRisorseDisponibili = false;
  463.                             }
  464.                         }
  465.                     }
  466.                    
  467.                
  468.                     // avvisi
  469.                     if(risorsaNonDisponibile!=null)
  470.                         this.msgDiag.addKeyword(CostantiPdD.KEY_RISORSA_NON_DISPONIBILE, risorsaNonDisponibile);
  471.                     if(!checkRisorseDisponibili && this.lastCheck){
  472.                         if(risorsaNonDisponibile!=null && (risorsaNonDisponibile.startsWith("[MessaggioDiagnosticoAppender")==false) ){
  473.                             if(risorsaNonDisponibile.startsWith("[Validazione semantica")){
  474.                                 this.msgDiag.logPersonalizzato("validazioneSemanticaFallita");
  475.                             }else{
  476.                                 this.msgDiag.logPersonalizzato("risorsaNonDisponibile");
  477.                             }
  478.                         }
  479.                         else
  480.                             this.logWarn("Il Monitoraggio delle risorse ha rilevato che la risorsa "+risorsaNonDisponibile+" non e' raggiungibile, tutti i servizi/moduli della porta di dominio sono momentanemanete sospesi.");
  481.                        
  482.                         registraEvento(false, descrizione);
  483.                        
  484.                     }else if(checkRisorseDisponibili && !this.lastCheck){
  485.                         this.msgDiag.logPersonalizzato("risorsaRitornataDisponibile");
  486.                         risorsaNonDisponibile = null;
  487.                        
  488.                         registraEvento(true, this.msgDiag.getMessaggio_replaceKeywords("risorsaRitornataDisponibile"));
  489.                     }
  490.                     this.lastCheck = checkRisorseDisponibili;
  491.                     TimerMonitoraggioRisorseThread.setRisorseDisponibili(checkRisorseDisponibili);
  492.                    
  493.                 }
  494.                 else {
  495.                     this.logger.info("Timer "+ID_MODULO+" disabilitato");
  496.                 }
  497.                
  498.                            
  499.                 // CheckInterval
  500.                 this.sleepForNextCheck((int) this.propertiesReader.getControlloRisorseCheckInterval(), 1000);
  501.                
  502.             }
  503.         }finally {
  504.             this.finished();
  505.         }
  506.     }
  507.    
  508.     private void registraEvento(boolean risorseDisponibili, String descrizione) {
  509.         String clusterID = this.propertiesReader.getClusterId(false);
  510.         Logger log = OpenSPCoop2Logger.getLoggerOpenSPCoopResources();
  511.         Evento evento = null;
  512.         try{
  513.             if(this.gestoreEventi!=null &&
  514.                 this.propertiesReader.isControlloRisorseRegistrazioneEvento()){
  515.                 evento = new Evento();
  516.                 evento.setTipo(TipoEvento.STATO_GATEWAY.getValue());
  517.                 evento.setCodice(risorseDisponibili ? CodiceEventoStatoGateway.RISORSE_SISTEMA_DISPONIBILI.getValue() : CodiceEventoStatoGateway.RISORSE_SISTEMA_NON_DISPONIBILI.getValue());
  518.                 evento.setSeverita(risorseDisponibili ? SeveritaConverter.toIntValue(TipoSeverita.INFO) : SeveritaConverter.toIntValue(TipoSeverita.ERROR));
  519.                 evento.setClusterId(clusterID);
  520.                 evento.setDescrizione(descrizione);
  521.                 this.gestoreEventi.log(evento,true);
  522.             }
  523.         }catch(Throwable e){ // Volutamente Throwable
  524.             // L'errore puo' avvenire poiche' lo shutdown puo' anche disattivare il datasource
  525.             log.debug("Errore durante la registrazione dell'evento (risorse disponibili:"+descrizione+" '"+descrizione+"'): "+e.getMessage(),e);
  526.             if(evento!=null){
  527.                 try{
  528.                     if(evento.getOraRegistrazione()==null){
  529.                         evento.setOraRegistrazione(DateManager.getDate());
  530.                     }
  531.                     ByteArrayOutputStream bout = new ByteArrayOutputStream();
  532.                     evento.writeTo(bout, WriteToSerializerType.XML_JAXB);
  533.                     bout.flush();
  534.                     bout.close();
  535.                     FileSystemSerializer.getInstance().registraEvento(bout.toByteArray(), evento.getOraRegistrazione());
  536.                 }catch(Exception eSerializer){
  537.                     log.error("Errore durante la registrazione su file system dell'evento: "+eSerializer.getMessage(),eSerializer);
  538.                 }
  539.             }
  540.         }
  541.     }
  542. }