TimerConsegnaContenutiApplicativi.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.sql.Connection;
  22. import java.util.ArrayList;
  23. import java.util.Date;
  24. import java.util.List;
  25. import java.util.Map;

  26. import org.openspcoop2.pdd.config.ConfigurazioneCoda;
  27. import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
  28. import org.openspcoop2.pdd.config.ConfigurazionePriorita;
  29. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  30. import org.openspcoop2.pdd.core.CostantiPdD;
  31. import org.openspcoop2.pdd.core.GestoreMessaggi;
  32. import org.openspcoop2.pdd.core.MessaggioServizioApplicativo;
  33. import org.openspcoop2.pdd.core.state.OpenSPCoopStateDBManager;
  34. import org.openspcoop2.pdd.core.state.OpenSPCoopStateful;
  35. import org.openspcoop2.pdd.logger.MsgDiagnostico;
  36. import org.openspcoop2.pdd.services.OpenSPCoop2Startup;
  37. import org.openspcoop2.protocol.engine.constants.Costanti;
  38. import org.openspcoop2.protocol.registry.RegistroServiziManager;
  39. import org.openspcoop2.protocol.sdk.state.StateMessage;
  40. import org.openspcoop2.utils.TipiDatabase;
  41. import org.openspcoop2.utils.Utilities;
  42. import org.openspcoop2.utils.UtilsException;
  43. import org.openspcoop2.utils.date.DateManager;
  44. import org.openspcoop2.utils.id.serial.InfoStatistics;
  45. import org.openspcoop2.utils.semaphore.Semaphore;
  46. import org.openspcoop2.utils.semaphore.SemaphoreConfiguration;
  47. import org.openspcoop2.utils.semaphore.SemaphoreMapping;
  48. import org.openspcoop2.utils.threads.IGestoreCodaRunnableInstance;
  49. import org.openspcoop2.utils.threads.Runnable;
  50. import org.openspcoop2.utils.threads.RunnableLogger;



  51. /**
  52.  * Timer che si occupa di re-inoltrare i messaggi in riconsegna
  53.  *
  54.  *  
  55.  * @author Poli Andrea (apoli@link.it)
  56.  * @author $Author$
  57.  * @version $Rev$, $Date$
  58.  */

  59. public class TimerConsegnaContenutiApplicativi implements IGestoreCodaRunnableInstance  {

  60.     private static TimerState STATE = TimerState.OFF; // abilitato in OpenSPCoop2Startup al momento dell'avvio

  61.     public static TimerState getSTATE() {
  62.         return STATE;
  63.     }
  64.     public static void setSTATE(TimerState sTATE) {
  65.         STATE = sTATE;
  66.     }

  67.     private MsgDiagnostico msgDiag = null;
  68.     private RunnableLogger log;
  69.     private RunnableLogger logSql;
  70.     private OpenSPCoop2Properties propertiesReader = null;
  71.     private boolean debug;
  72.     private String clusterId;

  73.     private RegistroServiziManager registroServiziReader;
  74.     private ConfigurazionePdDManager configurazionePdDReader;

  75.     private ConfigurazioneCoda configurazioneCoda;
  76.    
  77.     private List<ConfigurazionePriorita> configurazioniPriorita;
  78.    
  79.     private TimerLock timerLock = null;

  80.     /** Semaforo */
  81.     private Semaphore semaphore = null;
  82.     private InfoStatistics semaphore_statistics;

  83.     private Date lastCheckMessaggiDaRispedire = null;
  84.    
  85.     public TimerConsegnaContenutiApplicativi(ConfigurazioneCoda configurazioneCoda, MsgDiagnostico msgDiag,
  86.             RunnableLogger log, RunnableLogger logSql,
  87.             OpenSPCoop2Properties p,
  88.             ConfigurazionePdDManager configurazionePdDReader,RegistroServiziManager registroServiziReader) throws TimerException{
  89.         this.configurazioneCoda = configurazioneCoda;
  90.         this.msgDiag = msgDiag;
  91.         this.log = log;
  92.         this.logSql = logSql;
  93.         this.propertiesReader = p;
  94.         this.debug = configurazioneCoda.isDebug();
  95.         this.clusterId = p.getClusterId(false);
  96.        
  97.         this.configurazioniPriorita = new ArrayList<ConfigurazionePriorita>();
  98.         List<String> prioritaList = this.propertiesReader.getTimerConsegnaContenutiApplicativiPriorita();
  99.         for (int i = 0; i < prioritaList.size(); i++) {
  100.             String priorita = prioritaList.get(i);
  101.             this.configurazioniPriorita.add(this.propertiesReader.getTimerConsegnaContenutiApplicativiConfigurazionePriorita(priorita));
  102.         }
  103.        
  104.         this.configurazionePdDReader = configurazionePdDReader;
  105.         this.registroServiziReader = registroServiziReader;

  106.         // deve essere utilizzato lo stesso lock per GestoreMessaggi, ConsegnaContenuti, GestoreBuste per risolvere problema di eliminazione descritto in GestoreMessaggi metodo deleteMessageWithLock
  107.         //this.timerLock = new TimerLock(TipoLock.GESTIONE_REPOSITORY_MESSAGGI);
  108.         // l'utilizzo commentato sopra era ERRATO: i messaggi salvati con il timer di consegna contenuti applicativi vengono salvati con un nuovo identificativo 'gw-0-e20ae327-791c-40ef-84ad-4b141a0ef93f' e quindi non impattano sul problema descritto sopra.
  109.         this.timerLock = new TimerLock(TipoLock.CONSEGNA_NOTIFICHE, configurazioneCoda.getName());
  110.        
  111.         if(this.propertiesReader.isTimerLockByDatabase()) {
  112.             this.semaphore_statistics = new InfoStatistics();

  113.             SemaphoreConfiguration config = GestoreMessaggi.newSemaphoreConfiguration(this.propertiesReader.getTimerConsegnaContenutiApplicativiLockMaxLife(),
  114.                     this.propertiesReader.getTimerConsegnaContenutiApplicativiLockIdleTime());

  115.             TipiDatabase databaseType = TipiDatabase.toEnumConstant(this.propertiesReader.getDatabaseType());
  116.             try {
  117.                 this.semaphore = new Semaphore(this.semaphore_statistics, SemaphoreMapping.newInstance(this.timerLock.getIdLock()),
  118.                         config, databaseType, this.log.getLog());
  119.             }catch(Exception e) {
  120.                 throw new TimerException(e.getMessage(),e);
  121.             }
  122.         }
  123.     }

  124.     @Override
  125.     public void initialize(RunnableLogger log) throws UtilsException{
  126.        
  127.         OpenSPCoopStateful openspcoopstateGestore = new OpenSPCoopStateful();
  128.         try {

  129.             this.logDebug("Rilascio eventuali messaggi con lock appesi da riconsegnare verso il modulo ConsegnaContenutiApplicativi ...");
  130.            
  131.             openspcoopstateGestore.initResource(this.propertiesReader.getIdentitaPortaDefaultWithoutProtocol(),TimerConsegnaContenutiApplicativiThread.ID_MODULO, "initialize",
  132.                     OpenSPCoopStateDBManager.smistatoreMessaggiPresiInCarico);
  133.             Connection connectionDB = ((StateMessage)openspcoopstateGestore.getStatoRichiesta()).getConnectionDB();

  134.             // GestoreMessaggi da Ricercare
  135.             GestoreMessaggi gestoreMsgSearch = new GestoreMessaggi(openspcoopstateGestore, true,this.logSql.getLog(),this.msgDiag, null);
  136.    
  137.             String causaMessaggiINBOXDaRiconsegnare = "Rilascio eventuali messaggi con lock appesi da riconsegnare verso il modulo ConsegnaContenutiApplicativi";
  138.             try{
  139.                 GestoreMessaggi.acquireLock(
  140.                         this.semaphore, connectionDB, this.timerLock,
  141.                         this.msgDiag, causaMessaggiINBOXDaRiconsegnare,
  142.                         this.propertiesReader.getTimerConsegnaContenutiApplicativi_getLockAttesaAttiva(),
  143.                         this.propertiesReader.getTimerConsegnaContenutiApplicativi_getLockCheckInterval());
  144.            
  145.                 gestoreMsgSearch.releaseMessaggiPresaInCosegna(this.configurazioneCoda.getName(), this.clusterId, this.debug, this.logSql);
  146.                
  147.             }finally{
  148.                 try{
  149.                     GestoreMessaggi.releaseLock(
  150.                             this.semaphore, connectionDB, this.timerLock,
  151.                             this.msgDiag, causaMessaggiINBOXDaRiconsegnare);
  152.                 }catch(Exception e){
  153.                     // ignore
  154.                 }
  155.             }
  156.            
  157.             this.logDebug("Rilascio effettuato di eventuali messaggi con lock appesi da riconsegnare verso il modulo ConsegnaContenutiApplicativi");
  158.         }
  159.         catch (Exception e) {
  160.             this.msgDiag.logErroreGenerico(e,"GestioneMessaggiRilascioLockRiconsegnaConsegnaContenutiApplicativi");
  161.             this.logError("Riscontrato errore durante la gestione del repository dei messaggi (Rilascio lock per riconsegna verso ConsegnaContenutiApplicativi): "+ e.getMessage(),e);
  162.         }finally{
  163.             if(openspcoopstateGestore!=null)
  164.                 openspcoopstateGestore.releaseResource();
  165.         }
  166.     }
  167.    
  168.     private static final String DATA_START = "DATA_START";
  169.    
  170.     @Override
  171.     public void logCheckInProgress(Map<String, Object> context) {
  172.         // Prendo la gestione
  173.         this.msgDiag.logPersonalizzato("controlloInCorso");
  174.         this.log.info(this.msgDiag.getMessaggio_replaceKeywords("controlloInCorso"));
  175.         long startControlloRepositoryMessaggi = DateManager.getTimeMillis();
  176.         context.put(DATA_START, startControlloRepositoryMessaggi);
  177.     }
  178.    
  179.     @Override
  180.     public void logRegisteredThreads(Map<String, Object> context, int nuoviThreadsAttivati) {
  181.         if(nuoviThreadsAttivati>0){
  182.             this.msgDiag.addKeyword(CostantiPdD.KEY_TIMER_CONSEGNA_CONTENUTI_APPLICATIVI_NUMERO_MESSAGGI_INOLTRATI,nuoviThreadsAttivati+"");
  183.             this.msgDiag.logPersonalizzato("ricercaMessaggiDaInoltrare");
  184.         }
  185.     }
  186.    
  187.     @Override
  188.     public void logCheckFinished(Map<String, Object> context) {
  189.        
  190.         // end
  191.         long endControlloRepositoryMessaggi = DateManager.getTimeMillis();
  192.         long startControlloRepositoryMessaggi = (Long) context.get(DATA_START);
  193.         long diff = (endControlloRepositoryMessaggi-startControlloRepositoryMessaggi);
  194.         this.log.info("Controllo Repository Messaggi (Riconsegna verso ConsegnaContenutiApplicativi) terminato in "+Utilities.convertSystemTimeIntoStringMillisecondi(diff, true));

  195.     }
  196.    
  197.    
  198.     @Override
  199.     public List<Runnable> nextRunnable(int limit) throws UtilsException{
  200.            
  201.         List<Runnable> returnNull = null;
  202.        
  203.         // Controllo che il sistema non sia andando in shutdown
  204.         if(OpenSPCoop2Startup.contextDestroyed){
  205.             this.logError("Rilevato sistema in shutdown");
  206.             return returnNull;
  207.         }

  208.         // Controllo che l'inizializzazione corretta delle risorse sia effettuata
  209.         if(!OpenSPCoop2Startup.initialize){
  210.             this.msgDiag.logFatalError("inizializzazione di OpenSPCoop non effettuata", "Check Inizializzazione");
  211.             String msgErrore = "Riscontrato errore: inizializzazione del Timer o di OpenSPCoop non effettuata";
  212.             this.logError(msgErrore);
  213.             throw new UtilsException(msgErrore);
  214.         }

  215.         // Controllo risorse di sistema disponibili
  216.         if( !TimerMonitoraggioRisorseThread.isRisorseDisponibili()){
  217.             this.logError("Risorse di sistema non disponibili: "+TimerMonitoraggioRisorseThread.getRisorsaNonDisponibile().getMessage(),TimerMonitoraggioRisorseThread.getRisorsaNonDisponibile());
  218.             return returnNull;
  219.         }
  220.         if( !MsgDiagnostico.gestoreDiagnosticaDisponibile){
  221.             this.logError("Sistema di diagnostica non disponibile: "+MsgDiagnostico.motivoMalfunzionamentoDiagnostici.getMessage(),MsgDiagnostico.motivoMalfunzionamentoDiagnostici);
  222.             return returnNull;
  223.         }
  224.        
  225.         // Controllo che il timer non sia stato momentaneamente disabilitato
  226.         if(!TimerState.ENABLED.equals(STATE)) {
  227.             this.msgDiag.logPersonalizzato("disabilitato");
  228.             this.log.info(this.msgDiag.getMessaggio_replaceKeywords("disabilitato"));
  229.             return returnNull;
  230.         }
  231.        
  232.         OpenSPCoopStateful openspcoopstateGestore = new OpenSPCoopStateful();
  233.         try {

  234.             this.logDebug("Inizializzazione connessione al db per ricercare nuovi threads da attivare (limit: "+limit+") ...");
  235.             openspcoopstateGestore.initResource(this.propertiesReader.getIdentitaPortaDefaultWithoutProtocol(),TimerConsegnaContenutiApplicativiThread.ID_MODULO, "nextRunnable",
  236.                     OpenSPCoopStateDBManager.smistatoreMessaggiPresiInCarico);
  237.             Connection connectionDB = ((StateMessage)openspcoopstateGestore.getStatoRichiesta()).getConnectionDB();

  238.             boolean verificaPresenzaMessaggiDaRispedire = false;
  239.             boolean calcolaDataMinimaMessaggiRispedire = false;
  240.             Integer secondiAnzianitaPerIniziareSpedireNuovoMessaggio = this.configurazioneCoda.getScheduleMessageAfter();
  241.             if(this.lastCheckMessaggiDaRispedire==null) {
  242.                 this.lastCheckMessaggiDaRispedire=DateManager.getDate();
  243.                 verificaPresenzaMessaggiDaRispedire = true;
  244.             }
  245.             else {
  246.                 Date expired = new Date(DateManager.getTimeMillis()-(1000*this.configurazioneCoda.getNextMessages_consegnaFallita_intervalloControllo()));
  247.                 this.logDebug("("+this.configurazioneCoda.getName()+") Verifica check messaggi da spedire previsto quando ultimo chek '"+
  248.                         org.openspcoop2.utils.date.DateUtils.getSimpleDateFormatMs().format(this.lastCheckMessaggiDaRispedire)+"' < '"+org.openspcoop2.utils.date.DateUtils.getSimpleDateFormatMs().format(expired)+"' ...");
  249.                 if(this.lastCheckMessaggiDaRispedire.before(expired)) {
  250.                     verificaPresenzaMessaggiDaRispedire = true;
  251.                     this.lastCheckMessaggiDaRispedire=DateManager.getDate();
  252.                 }
  253.             }
  254.             if(verificaPresenzaMessaggiDaRispedire) {
  255.                 calcolaDataMinimaMessaggiRispedire = this.configurazioneCoda.isNextMessages_consegnaFallita_calcolaDataMinimaRiconsegna();
  256.             }
  257.             this.logDebug("("+this.configurazioneCoda.getName()+") verificaPresenzaMessaggiDaRispedire:"+verificaPresenzaMessaggiDaRispedire+" calcolaDataMinimaMessaggiRispedire:"+calcolaDataMinimaMessaggiRispedire);

  258.            
  259.             // GestoreMessaggi da Ricercare
  260.             GestoreMessaggi gestoreMsgSearch = new GestoreMessaggi(openspcoopstateGestore, true,this.logSql.getLog(),this.msgDiag, null);
  261.            
  262.             Date now = DateManager.getDate();
  263.             List<MessaggioServizioApplicativo> msgDaRiconsegnareINBOX = new ArrayList<>();
  264.            
  265.             // APPLICATIVI PRIORITARI
  266.             List<String> serviziApplicativiPrioritari = this.configurazionePdDReader.getServiziApplicativiConsegnaNotifichePrioritarie(this.configurazioneCoda.getName());
  267.             if(serviziApplicativiPrioritari!=null && !serviziApplicativiPrioritari.isEmpty()) {
  268.                
  269.                 String prefix = "[Applicativi Prioritari] ";
  270.                 String causale = prefix+"Messaggi da riconsegnare verso il modulo ConsegnaContenutiApplicativi";
  271.                 try {
  272.                     this.logDebug(prefix+"Acquisizione lock per ricercare nuovi threads da attivare (limit: "+limit+") ...");
  273.                     this.lock(connectionDB, causale);
  274.                    
  275.                     this.logDebug(prefix+"Lock acquisito, ricerca nuovi threads da attivare (limit: "+limit+") ...");
  276.                     List<MessaggioServizioApplicativo> msgDaRiconsegnareINBOX_priorita =
  277.                             gestoreMsgSearch.readMessaggiDaRiconsegnareIntoBoxByServiziApplicativPrioritari(limit,
  278.                                     verificaPresenzaMessaggiDaRispedire, calcolaDataMinimaMessaggiRispedire,secondiAnzianitaPerIniziareSpedireNuovoMessaggio,
  279.                                     now,
  280.                                     this.propertiesReader.getTimerConsegnaContenutiApplicativiPresaInConsegnaMaxLife(),
  281.                                     this.debug,this.logSql,
  282.                                     this.configurazioneCoda.getName(),
  283.                                     serviziApplicativiPrioritari.toArray(new String[1]));
  284.                    
  285.                     if(msgDaRiconsegnareINBOX_priorita!=null && !msgDaRiconsegnareINBOX_priorita.isEmpty()) {
  286.                         this.logDebug(prefix+"Ricerca nuovi threads da attivare terminata (limit: "+limit+"); prendo in carico "+
  287.                                 msgDaRiconsegnareINBOX_priorita.size()+" messaggi ...");
  288.                        
  289.                         for (MessaggioServizioApplicativo messaggioServizioApplicativo : msgDaRiconsegnareINBOX_priorita) {
  290.                             GestoreMessaggi messaggioDaInviare = new GestoreMessaggi(openspcoopstateGestore,true,messaggioServizioApplicativo.getIdMessaggio(),Costanti.INBOX,
  291.                                     this.log.getLog(),this.msgDiag,null);
  292.                             messaggioDaInviare.updateMessaggioPresaInCosegna(messaggioServizioApplicativo.getServizioApplicativo(),
  293.                                     this.clusterId, this.debug, this.logSql);
  294.                            
  295.                             msgDaRiconsegnareINBOX.add(messaggioServizioApplicativo);
  296.                         }
  297.                        
  298.                         this.logDebug(prefix+"Presa in carico "+msgDaRiconsegnareINBOX_priorita.size()+" messaggi terminata, rilascio lock...");
  299.                     }
  300.                     else {
  301.                         this.logDebug(prefix+"Ricerca nuovi threads da attivare terminata (limit: "+limit+"); non sono presenti messaggi, rilascio lock...");
  302.                     }
  303.                    
  304.                 }finally{
  305.                     this.releaseLock(connectionDB, causale);
  306.                 }
  307.                 this.logDebug(prefix+"Lock rilasciato");
  308.             }
  309.            
  310.             int finestraAncoraDisponibileDopoApplicativiPrioritari = limit - msgDaRiconsegnareINBOX.size();
  311.                        
  312.             if(finestraAncoraDisponibileDopoApplicativiPrioritari>0) {
  313.                 for (ConfigurazionePriorita configurazionePriorita : this.configurazioniPriorita) {
  314.    
  315.                     String prefix = "[P-"+configurazionePriorita.getLabel()+"] ";
  316.                    
  317.                     int limitPriorita = 0;
  318.                     if(configurazionePriorita.isNessunaPriorita()) {
  319.                         limitPriorita = limit - msgDaRiconsegnareINBOX.size();
  320.                         this.logDebug(prefix+"Calcolo limit; cerco entries rimaste senza guardare la priorità ("+limitPriorita+") ...");
  321.                     }
  322.                     else {
  323.                         limitPriorita = (finestraAncoraDisponibileDopoApplicativiPrioritari * configurazionePriorita.getPercentuale()) / 100;
  324.                         this.logDebug(prefix+"Calcolo limit; "+configurazionePriorita.getPercentuale()+"% di "+finestraAncoraDisponibileDopoApplicativiPrioritari+": "+limitPriorita+" ...");
  325.                     }
  326.                     if(limitPriorita<=0) {
  327.                         this.logDebug(prefix+"Per la priorità non è necessario cercare alcun messaggio");
  328.                         continue;
  329.                     }
  330.                    
  331.                     String causale = prefix+"Messaggi da riconsegnare verso il modulo ConsegnaContenutiApplicativi";
  332.                     try {
  333.                         this.logDebug(prefix+"Acquisizione lock per ricercare nuovi threads da attivare (limit: "+limitPriorita+") ...");
  334.                         this.lock(connectionDB, causale);
  335.                        
  336.                         this.logDebug(prefix+"Lock acquisito, ricerca nuovi threads da attivare (limit: "+limitPriorita+") ...");
  337.                         List<MessaggioServizioApplicativo> msgDaRiconsegnareINBOXpriorita =
  338.                                 gestoreMsgSearch.readMessaggiDaRiconsegnareIntoBoxByPriorita(limitPriorita,
  339.                                         verificaPresenzaMessaggiDaRispedire, calcolaDataMinimaMessaggiRispedire, secondiAnzianitaPerIniziareSpedireNuovoMessaggio,
  340.                                         now,
  341.                                         this.propertiesReader.getTimerConsegnaContenutiApplicativiPresaInConsegnaMaxLife(),
  342.                                         this.debug,this.logSql,
  343.                                         this.configurazioneCoda.getName(),
  344.                                         configurazionePriorita.isNessunaPriorita() ? null : configurazionePriorita.getName());
  345.                        
  346.                         if(msgDaRiconsegnareINBOXpriorita!=null && !msgDaRiconsegnareINBOXpriorita.isEmpty()) {
  347.                             this.logDebug(prefix+"Ricerca nuovi threads da attivare terminata (limit: "+limitPriorita+"); prendo in carico "+
  348.                                     msgDaRiconsegnareINBOXpriorita.size()+" messaggi ...");
  349.                            
  350.                             // La finestra non deve essere ricalcolata
  351.                             /**finestraAncoraDisponibileDopoApplicativiPrioritari = finestraAncoraDisponibileDopoApplicativiPrioritari - msgDaRiconsegnareINBOX_priorita.size();*/
  352.                            
  353.                             for (MessaggioServizioApplicativo messaggioServizioApplicativo : msgDaRiconsegnareINBOXpriorita) {
  354.                                 GestoreMessaggi messaggioDaInviare = new GestoreMessaggi(openspcoopstateGestore,true,messaggioServizioApplicativo.getIdMessaggio(),Costanti.INBOX,
  355.                                         this.log.getLog(),this.msgDiag,null);
  356.                                 messaggioDaInviare.updateMessaggioPresaInCosegna(messaggioServizioApplicativo.getServizioApplicativo(),
  357.                                         this.clusterId, this.debug, this.logSql);
  358.                                
  359.                                 msgDaRiconsegnareINBOX.add(messaggioServizioApplicativo);
  360.                             }
  361.                            
  362.                             this.logDebug(prefix+"Presa in carico "+msgDaRiconsegnareINBOXpriorita.size()+" messaggi terminata, rilascio lock...");
  363.                         }
  364.                         else {
  365.                             this.logDebug(prefix+"Ricerca nuovi threads da attivare terminata (limit: "+limitPriorita+"); non sono presenti messaggi, rilascio lock...");
  366.                         }
  367.                        
  368.                     }finally{
  369.                         this.releaseLock(connectionDB, causale);
  370.                     }
  371.                     this.logDebug(prefix+"Lock rilasciato");
  372.                    
  373.                 }
  374.             }
  375.            
  376.             this.logDebug("Creazione Runnable ...");
  377.             List<Runnable> listRunnable = null;
  378.             if(msgDaRiconsegnareINBOX!=null && !msgDaRiconsegnareINBOX.isEmpty()) {
  379.                 listRunnable = new ArrayList<>();
  380.                 for (MessaggioServizioApplicativo messaggioServizioApplicativo : msgDaRiconsegnareINBOX) {
  381.                     TimerConsegnaContenutiApplicativiSender sender =
  382.                             new TimerConsegnaContenutiApplicativiSender(messaggioServizioApplicativo,
  383.                                     this.registroServiziReader, this.configurazionePdDReader,
  384.                                     this.clusterId, this.configurazioneCoda);
  385.                     listRunnable.add(new Runnable(sender, -1));
  386.                 }
  387.             }
  388.             this.logDebug("Creazione Runnable terminata");
  389.            
  390.             return listRunnable;
  391.         }
  392.         catch(TimerLockNotAvailableException t) {
  393.             // msg diagnostico emesso durante l'emissione dell'eccezione
  394.             this.log.info(t.getMessage(),t);
  395.         }
  396.         catch (Exception e) {
  397.             this.msgDiag.logErroreGenerico(e,"GestioneMessaggiRiconsegnaConsegnaContenutiApplicativi");
  398.             this.logError("Riscontrato errore durante la gestione del repository dei messaggi (Riconsegna verso ConsegnaContenutiApplicativi): "+ e.getMessage(),e);
  399.         }finally{
  400.             if(openspcoopstateGestore!=null)
  401.                 openspcoopstateGestore.releaseResource();
  402.         }
  403.        
  404.         return returnNull;
  405.     }

  406.     private void lock(Connection connectionDB, String causale) throws UtilsException, TimerLockNotAvailableException {
  407.         GestoreMessaggi.acquireLock(
  408.                 this.semaphore, connectionDB, this.timerLock,
  409.                 this.msgDiag, causale,
  410.                 this.propertiesReader.getTimerConsegnaContenutiApplicativi_getLockAttesaAttiva(),
  411.                 this.propertiesReader.getTimerConsegnaContenutiApplicativi_getLockCheckInterval());
  412.     }
  413.     private void releaseLock(Connection connectionDB, String causale) {
  414.         try{
  415.             GestoreMessaggi.releaseLock(
  416.                     this.semaphore, connectionDB, this.timerLock,
  417.                     this.msgDiag, causale);
  418.         }catch(Exception e){
  419.             // ignore
  420.         }
  421.     }
  422.    
  423.     private void logDebug(String msg) {
  424.         this.logDebug(msg, null);
  425.     }
  426.     private void logDebug(String msg, Throwable e) {
  427.         if(e!=null) {
  428.             this.log.debug(getPrefix()+msg, e);
  429.         }
  430.         else {
  431.             this.log.debug(getPrefix()+msg);
  432.         }
  433.     }
  434.    
  435.     private void logError(String msg) {
  436.         this.logError(msg, null);
  437.     }
  438.     private void logError(String msg, Throwable e) {
  439.         if(e!=null) {
  440.             this.log.error(getPrefix()+msg, e);
  441.         }
  442.         else {
  443.             this.log.error(getPrefix()+msg);
  444.         }
  445.     }
  446.    
  447.     private String getPrefix() {
  448.         if(this.configurazioneCoda!=null) {
  449.             return "["+this.configurazioneCoda.getName()+"] ";
  450.         }
  451.         return "";
  452.     }
  453. }