PostOutResponseHandlerGestioneControlloTraffico.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.core.controllo_traffico.handler;

  21. import java.util.ArrayList;
  22. import java.util.List;

  23. import org.openspcoop2.core.controllo_traffico.beans.IDUnivocoGroupByPolicy;
  24. import org.openspcoop2.core.controllo_traffico.beans.MisurazioniTransazione;
  25. import org.openspcoop2.core.controllo_traffico.driver.IGestorePolicyAttive;
  26. import org.openspcoop2.core.controllo_traffico.driver.IPolicyGroupByActiveThreads;
  27. import org.openspcoop2.core.controllo_traffico.driver.PolicyNotFoundException;
  28. import org.openspcoop2.core.controllo_traffico.driver.PolicyShutdownException;
  29. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  30. import org.openspcoop2.pdd.core.controllo_traffico.CostantiControlloTraffico;
  31. import org.openspcoop2.pdd.core.controllo_traffico.GeneratoreMessaggiErrore;
  32. import org.openspcoop2.pdd.core.controllo_traffico.GestoreControlloTraffico;
  33. import org.openspcoop2.pdd.core.controllo_traffico.policy.config.PolicyConfiguration;
  34. import org.openspcoop2.pdd.core.controllo_traffico.policy.driver.GestorePolicyAttive;
  35. import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
  36. import org.openspcoop2.pdd.logger.transazioni.InformazioniTransazione;
  37. import org.openspcoop2.pdd.logger.transazioni.TransazioniProcessTimes;
  38. import org.openspcoop2.protocol.sdk.Context;
  39. import org.openspcoop2.utils.date.DateManager;
  40. import org.slf4j.Logger;

  41. /**    
  42.  * PostOutResponseHandlerGestioneControlloTraffico
  43.  *
  44.  * @author Poli Andrea (poli@link.it)
  45.  * @author $Author$
  46.  * @version $Rev$, $Date$
  47.  */
  48. public class PostOutResponseHandlerGestioneControlloTraffico {

  49.     public void process(Boolean controlloTrafficoMaxRequestThreadRegistrato, Logger logger, String idTransazione,
  50.             MisurazioniTransazione misurazioniTransazione, InformazioniTransazione info,
  51.             TransazioniProcessTimes times){
  52.        
  53.         Context context = info.getContext();
  54.        
  55.         long timeStart = -1;
  56.        
  57.         if(controlloTrafficoMaxRequestThreadRegistrato!=null && controlloTrafficoMaxRequestThreadRegistrato){
  58.             // significa che sono entrato nel motore di anti-congestionamento
  59.             if(times!=null) {
  60.                 timeStart = DateManager.getTimeMillis();
  61.             }
  62.             try {
  63.                
  64.                 Long maxThreads = null;
  65.                 Integer threshold = null;
  66.                
  67.                 if(context!=null){
  68.                     Object maxThreadsObject = context.getObject(GeneratoreMessaggiErrore.PDD_CONTEXT_MAX_THREADS_THRESHOLD);
  69.                     if(maxThreadsObject instanceof Long){
  70.                         maxThreads = (Long) maxThreadsObject;
  71.                     }
  72.                    
  73.                     Object thresholdObject = context.getObject(GeneratoreMessaggiErrore.PDD_CONTEXT_CONTROLLO_TRAFFICO_THRESHOLD);
  74.                     if(thresholdObject!=null && maxThreadsObject instanceof Long){
  75.                         threshold = (Integer) thresholdObject;
  76.                     }
  77.                 }
  78.                
  79.                 GestoreControlloTraffico.getInstance().removeThread(maxThreads,threshold,idTransazione);
  80.             } catch (Exception e) {
  81.                 logger.error("["+idTransazione+"] Errore durante la rimozione del thread all'interno della lista dei threads attivi",e);
  82.             }
  83.             if(times!=null) {
  84.                 long timeEnd =  DateManager.getTimeMillis();
  85.                 long timeProcess = timeEnd-timeStart;
  86.                 times.setControlloTrafficoRemoveThread(timeProcess);
  87.             }
  88.         }
  89.         try {
  90.             Logger logControlloTraffico = OpenSPCoop2Logger.getLoggerOpenSPCoopControlloTraffico(OpenSPCoop2Properties.getInstance().isControlloTrafficoDebug());
  91.             if(misurazioniTransazione!=null){
  92.            
  93.                 if(times!=null) {
  94.                     timeStart = DateManager.getTimeMillis();
  95.                 }
  96.                
  97.                 Object objectId = null;
  98.                 if(context!=null) {
  99.                     objectId = context.removeObject(CostantiControlloTraffico.PDD_CONTEXT_LIST_UNIQUE_ID_POLICY);
  100.                 }
  101.                 if(context!=null &&
  102.                         objectId!=null && (objectId instanceof List<?>) ){
  103.                     @SuppressWarnings("unchecked")
  104.                     List<String> uniqueIdsPolicies = (List<String>) objectId;
  105.                     if(uniqueIdsPolicies!=null && !uniqueIdsPolicies.isEmpty()){
  106.                         Object object = context.removeObject(CostantiControlloTraffico.PDD_CONTEXT_LIST_GROUP_BY_CONDITION);
  107.                         Object objectIncrementCounterPolicyApplicabile = context.removeObject(CostantiControlloTraffico.PDD_CONTEXT_LIST_POLICY_APPLICABILE);
  108.                         Object objectIncrementCounterPolicyViolata = context.removeObject(CostantiControlloTraffico.PDD_CONTEXT_LIST_POLICY_VIOLATA);
  109.                         Object objectPolicyTypes = context.removeObject(CostantiControlloTraffico.PDD_CONTEXT_LIST_API_OR_GLOBAL_OR_DEFAULT);
  110.                         Object objectPolicyConfigurationPorta = context.removeObject(CostantiControlloTraffico.PDD_CONTEXT_POLICY_CONFIG_PORTA);
  111.                         Object objectPolicyConfigurationGlobale = context.removeObject(CostantiControlloTraffico.PDD_CONTEXT_POLICY_CONFIG_GLOBALE);
  112.                         if((object instanceof List<?>) &&
  113.                                 objectIncrementCounterPolicyApplicabile!=null && (objectIncrementCounterPolicyApplicabile instanceof List<?>) &&
  114.                                 objectIncrementCounterPolicyViolata!=null && (objectIncrementCounterPolicyViolata instanceof List<?>) &&
  115.                                 objectPolicyTypes!=null && (objectPolicyTypes instanceof List<?>) &&
  116.                                 objectPolicyConfigurationGlobale!=null && (objectPolicyConfigurationGlobale instanceof PolicyConfiguration) &&
  117.                                 objectPolicyConfigurationPorta!=null && (objectPolicyConfigurationPorta instanceof PolicyConfiguration)){
  118.                             @SuppressWarnings("unchecked")
  119.                             List<IDUnivocoGroupByPolicy> groupByPolicies = (List<IDUnivocoGroupByPolicy>) object;
  120.                             @SuppressWarnings("unchecked")
  121.                             List<Boolean> incrementCounterPolicyApplicabile = (List<Boolean>) objectIncrementCounterPolicyApplicabile;
  122.                             @SuppressWarnings("unchecked")
  123.                             List<Boolean> incrementCounterPolicyViolata = (List<Boolean>) objectIncrementCounterPolicyViolata;
  124.                             @SuppressWarnings("unchecked")
  125.                             List<String> policyTypes = (List<String>) objectPolicyTypes;
  126.                             PolicyConfiguration policyConfigurationGlobale = (PolicyConfiguration) objectPolicyConfigurationGlobale;
  127.                             PolicyConfiguration policyConfigurationPorta = (PolicyConfiguration) objectPolicyConfigurationPorta;
  128.                             if(groupByPolicies!=null && groupByPolicies.size()==uniqueIdsPolicies.size() &&
  129.                                     incrementCounterPolicyApplicabile!=null && incrementCounterPolicyApplicabile.size()==uniqueIdsPolicies.size() &&
  130.                                     incrementCounterPolicyViolata!=null && incrementCounterPolicyViolata.size()==uniqueIdsPolicies.size() &&
  131.                                     policyTypes!=null && policyTypes.size()==uniqueIdsPolicies.size() &&
  132.                                     policyConfigurationGlobale!=null &&
  133.                                     policyConfigurationPorta!=null) {
  134.                                                                
  135.                                 if(times!=null) {
  136.                                     long timeEnd =  DateManager.getTimeMillis();
  137.                                     long timeProcess = timeEnd-timeStart;
  138.                                     times.setControlloTrafficoPreparePolicy(timeProcess);
  139.                                
  140.                                     if(!uniqueIdsPolicies.isEmpty()) {
  141.                                         times.setControlloTrafficoPolicyTimes(new ArrayList<>());
  142.                                     }
  143.                                 }
  144.                                
  145.                                 for (int i = 0; i < uniqueIdsPolicies.size(); i++) {
  146.                                     String uniqueIdMap = null;
  147.                                     try{
  148.                                         uniqueIdMap = uniqueIdsPolicies.get(i);
  149.                                        
  150.                                         StringBuilder sb = null;
  151.                                         if(times!=null) {
  152.                                             timeStart = DateManager.getTimeMillis();
  153.                                         }
  154.                                        
  155.                                         String policyAPI = policyTypes.get(i);
  156.                                         PolicyConfiguration policyConfiguration = null;
  157.                                         if(CostantiControlloTraffico.PDD_CONTEXT_LIST_API_OR_GLOBAL_OR_DEFAULT_VALUE_API.equals(policyAPI)) {
  158.                                             policyConfiguration = policyConfigurationPorta;
  159.                                         }
  160.                                         else if(CostantiControlloTraffico.PDD_CONTEXT_LIST_API_OR_GLOBAL_OR_DEFAULT_VALUE_GLOBAL.equals(policyAPI)) {
  161.                                             policyConfiguration = policyConfigurationGlobale;
  162.                                         }
  163.                                         else {
  164.                                             /**CostantiControlloTraffico.PDD_CONTEXT_LIST_API_OR_GLOBAL_OR_DEFAULT_VALUE_DEFAULT;*/
  165.                                             policyConfiguration = new PolicyConfiguration(true);
  166.                                         }
  167.                                         IGestorePolicyAttive gestorePolicy = GestorePolicyAttive.getInstance(policyConfiguration.getType());
  168.                                        
  169.                                         IPolicyGroupByActiveThreads policyGroupByActiveThreads = gestorePolicy.getActiveThreadsPolicy(uniqueIdMap);
  170.                                        
  171.                                         if(times!=null) {
  172.                                             sb = new StringBuilder(uniqueIdMap);
  173.                                             sb.append("[");
  174.                                             long timeEnd =  DateManager.getTimeMillis();
  175.                                             long timeProcess = timeEnd-timeStart;
  176.                                             sb.append(timeProcess);
  177.                                             timeStart = DateManager.getTimeMillis();
  178.                                         }
  179.                                        
  180.                                         org.openspcoop2.utils.Map<Object> mapContext = null;
  181.                                         if(context!=null) {
  182.                                             mapContext = context;
  183.                                         }
  184.                                        
  185.                                         policyGroupByActiveThreads.
  186.                                             registerStopRequest(logControlloTraffico, idTransazione, groupByPolicies.get(i),mapContext,
  187.                                                     misurazioniTransazione,
  188.                                                     incrementCounterPolicyApplicabile.get(i),
  189.                                                     incrementCounterPolicyViolata.get(i));
  190.                                        
  191.                                         if(times!=null) {
  192.                                             sb.append(",");
  193.                                             long timeEnd =  DateManager.getTimeMillis();
  194.                                             long timeProcess = timeEnd-timeStart;
  195.                                             sb.append(timeProcess);
  196.                                             sb.append("]");
  197.                                             times.getControlloTrafficoPolicyTimes().add(sb.toString());
  198.                                         }
  199.                                        
  200.                                     }catch(PolicyNotFoundException notFound){
  201.                                         logControlloTraffico.debug("NotFoundException durante la registrazione di terminazione del thread (policy inspection: "+uniqueIdMap+")",notFound);
  202.                                     }catch(PolicyShutdownException shutdown){
  203.                                         logControlloTraffico.debug("PolicyShutdownException durante la registrazione di terminazione del thread (policy inspection: "+uniqueIdMap+")",shutdown);
  204.                                     }  
  205.                                     catch(Throwable error){
  206.                                         logControlloTraffico.error("Errore durante la registrazione di terminazione del thread (policy inspection: "+uniqueIdMap+"): "+error.getMessage(),error);
  207.                                     }  
  208.                                 }
  209.                             }                                  

  210.                         }
  211.                     }
  212.                 }
  213.                
  214.             }
  215.         } catch (Exception e) {
  216.             logger.error("["+idTransazione+"] Errore durante la registrazione di terminazione del thread (policy inspection)",e);
  217.         }
  218.     }
  219.    
  220. }