AbstractPolicyGroupByActiveThreadsDistributed.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.policy.driver.hazelcast;

  21. import java.util.ArrayList;
  22. import java.util.Date;
  23. import java.util.List;
  24. import java.util.Map;

  25. import org.openspcoop2.core.controllo_traffico.beans.ActivePolicy;
  26. import org.openspcoop2.core.controllo_traffico.beans.DatiCollezionati;
  27. import org.openspcoop2.core.controllo_traffico.beans.IDUnivocoGroupByPolicy;
  28. import org.openspcoop2.core.controllo_traffico.beans.IDUnivocoGroupByPolicyMapId;
  29. import org.openspcoop2.core.controllo_traffico.beans.UniqueIdentifierUtilities;
  30. import org.openspcoop2.core.controllo_traffico.constants.Costanti;
  31. import org.openspcoop2.core.controllo_traffico.driver.IPolicyGroupByActiveThreadsInMemory;
  32. import org.openspcoop2.core.controllo_traffico.driver.PolicyException;
  33. import org.openspcoop2.core.controllo_traffico.driver.PolicyGroupByActiveThreadsType;
  34. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  35. import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
  36. import org.openspcoop2.utils.UtilsException;
  37. import org.slf4j.Logger;

  38. import com.hazelcast.core.HazelcastInstance;
  39. import com.hazelcast.map.IMap;

  40. /**    
  41.  *  PolicyGroupByActiveThreadsDistributedAbstract
  42.  *
  43.  * @author Francesco Scarlato (scarlato@link.it)
  44.  * @author $Author$
  45.  * @version $Rev$, $Date$
  46.  */
  47. public abstract class AbstractPolicyGroupByActiveThreadsDistributed implements IPolicyGroupByActiveThreadsInMemory {
  48.    
  49.     protected final HazelcastInstance hazelcast;
  50.     protected final IMap<IDUnivocoGroupByPolicy, DatiCollezionati> distributedMap;
  51.     protected final ActivePolicy activePolicy;
  52.    
  53.     protected PolicyGroupByActiveThreadsType type;
  54.    
  55.     protected String uniqueIdMap_idActivePolicy;
  56.     protected Date uniqueIdMap_updateTime;
  57.    
  58.     public AbstractPolicyGroupByActiveThreadsDistributed(ActivePolicy policy, String uniqueIdMap, PolicyGroupByActiveThreadsType type, HazelcastInstance hazelcast) throws PolicyException {
  59.         this.activePolicy = policy;
  60.         this.hazelcast = hazelcast;
  61.    
  62.         this.uniqueIdMap_idActivePolicy = UniqueIdentifierUtilities.extractIdActivePolicy(uniqueIdMap);
  63.         try {
  64.             this.uniqueIdMap_updateTime = UniqueIdentifierUtilities.extractUpdateTimeActivePolicy(uniqueIdMap);
  65.         }catch(Exception e) {
  66.             throw new PolicyException(e.getMessage(),e);
  67.         }
  68.        
  69.         OpenSPCoop2Properties op2Properties = OpenSPCoop2Properties.getInstance();
  70.         Logger log = OpenSPCoop2Logger.getLoggerOpenSPCoopControlloTraffico(op2Properties.isControlloTrafficoDebug());
  71.    
  72.         this.type = type;
  73.         String mapName = "hazelcast-";
  74.         switch (type) {
  75.         case HAZELCAST_MAP:
  76.             mapName = "hazelcast-";
  77.             break;
  78.         case HAZELCAST_NEAR_CACHE:
  79.             mapName = "hazelcast-near-cache-";
  80.             break;
  81.         case HAZELCAST_NEAR_CACHE_UNSAFE_SYNC_MAP:
  82.             mapName = "hazelcast-near-cache-unsafe-sync-map-";
  83.             break;
  84.         case HAZELCAST_NEAR_CACHE_UNSAFE_ASYNC_MAP:
  85.             mapName = "hazelcast-near-cache-unsafe-async-map-";
  86.             break;
  87.         case HAZELCAST_LOCAL_CACHE:
  88.             mapName = "hazelcast-local-cache-";
  89.             break;
  90.         default:
  91.             break;
  92.         }
  93.        
  94.         boolean oneMapForeachPolicy = OpenSPCoop2Properties.getInstance().isControlloTrafficoGestorePolicyInMemoryHazelcastOneMapForeachPolicy();
  95.         if(oneMapForeachPolicy && PolicyGroupByActiveThreadsType.HAZELCAST_LOCAL_CACHE.equals(this.type)) {
  96.             log.warn("Property isControlloTrafficoGestorePolicyInMemoryHazelcastOneMapForeachPolicy non compatibile con HAZELCAST_LOCAL_CACHE");
  97.             oneMapForeachPolicy = false;
  98.         }
  99.        
  100.         if (oneMapForeachPolicy) {
  101.             this.distributedMap = this.hazelcast.getMap(mapName + this.uniqueIdMap_idActivePolicy + "-rate-limiting");
  102.             log.info("Hazelcast: Utilizzo Una Distributed Map per gruppo.");
  103.         } else {
  104.             this.distributedMap = this.hazelcast.getMap(mapName+"rate-limiting");
  105.             log.info("Hazelcast: Utilizzo Una Distributed Map globale.");
  106.         }
  107.        
  108.         // dummy get per inizializzare la map
  109.         if(this.distributedMap.get(new IDUnivocoGroupByPolicy())!=null) {
  110.             // ignore
  111.         }

  112.     }
  113.    

  114.     @Override
  115.     public ActivePolicy getActivePolicy() {
  116.         return this.activePolicy;
  117.     }


  118.     @Override
  119.     public Map<IDUnivocoGroupByPolicy, DatiCollezionati> getMapActiveThreads() {
  120.         return this.distributedMap;
  121.     }
  122.    
  123.     public IMap<IDUnivocoGroupByPolicy, DatiCollezionati> getDistributedMapActiveThreads(){
  124.         return this.distributedMap;
  125.     }


  126.     @Override
  127.     public long getActiveThreads() {
  128.         return this.getActiveThreads(null);
  129.     }
  130.    
  131.     @Override
  132.     public void initMap(Map<IDUnivocoGroupByPolicy, DatiCollezionati> map) {
  133.         if(map!=null && !map.isEmpty()) {
  134.             for (IDUnivocoGroupByPolicy datiGroupBy : map.keySet()) {
  135.                 datiGroupBy = augmentIDUnivoco(datiGroupBy);
  136.                 DatiCollezionati dati = map.get(datiGroupBy);
  137.                 InitProcessor initProcessor = new InitProcessor(dati);
  138.                 this.distributedMap.executeOnKey(datiGroupBy, initProcessor);          
  139.             }
  140.         }
  141.        
  142.     }


  143.     @Override
  144.     public long getActiveThreads(IDUnivocoGroupByPolicy filtro) {

  145.         long counter = 0;
  146.        
  147.         // Quando leggo dalla distributedMap non aumento l'idUnivoco perchè
  148.         // mi aspetto che sulla map vengano già registrati così.
  149.        
  150.         if(filtro!=null){
  151.     //      FIX: iterando nella maniera sottostante si ottiene il seguente errore se si usa la near-cache: key cannot be of type Data! hazelcast
  152.     //      for (var entry : this.distributedMap) {
  153.             for (IDUnivocoGroupByPolicy datiGroupBy : this.distributedMap.keySet()) {
  154.                 if(!datiGroupBy.match(filtro)){
  155.                     continue;
  156.                 }
  157.                 DatiCollezionati datiCollezionati = this.distributedMap.get(datiGroupBy);
  158.                 counter += datiCollezionati.getActiveRequestCounter();
  159.             }
  160.         }
  161.        
  162.         return counter;
  163.     }


  164.     @Override
  165.     public void resetCounters() {
  166.         this.distributedMap.executeOnEntries(new ResetCountersProcessor());
  167.     }

  168.     @Override
  169.     public void remove() throws UtilsException{
  170.     //      FIX: iterando nella maniera sottostante si ottiene il seguente errore se si usa la near-cache: key cannot be of type Data! hazelcast
  171.     //      for (var entry : this.distributedMap) {
  172.         List<IDUnivocoGroupByPolicy> deleteList = new ArrayList<IDUnivocoGroupByPolicy>();
  173.         for (IDUnivocoGroupByPolicy datiGroupBy : this.distributedMap.keySet()) {
  174.             if(datiGroupBy instanceof IDUnivocoGroupByPolicyMapId){
  175.                 IDUnivocoGroupByPolicyMapId mapId = (IDUnivocoGroupByPolicyMapId) datiGroupBy;
  176.                 if(this.uniqueIdMap_idActivePolicy.equals(mapId.getUniqueMapId())) {
  177.                     deleteList.add(datiGroupBy);
  178.                 }
  179.             }
  180.         }
  181.         while(!deleteList.isEmpty()) {
  182.             IDUnivocoGroupByPolicy id = deleteList.remove(0);
  183.             this.distributedMap.remove(id);
  184.         }
  185.     }
  186.    
  187.     @Override
  188.     public String printInfos(Logger log, String separatorGroups) throws UtilsException {
  189.         return printInfos(log, separatorGroups, this.distributedMap);
  190.     }
  191.     protected String printInfos(Logger log, String separatorGroups, Map<IDUnivocoGroupByPolicy, DatiCollezionati> map) throws UtilsException {
  192.         StringBuilder bf = new StringBuilder();

  193.         //System.out.println("\n\nPRINT INFO");
  194.        
  195.         for (IDUnivocoGroupByPolicy datiGroupBy : map.keySet()) {
  196.            
  197.             DatiCollezionati datiCollezionati = map.get(datiGroupBy);
  198.            
  199. //      FIX: iterando nella maniera sottostante si ottiene il seguente errore se si usa la near-cache: key cannot be of type Data! hazelcast
  200. //      for (var entry : this.distributedMap) {
  201. //          IDUnivocoGroupByPolicy datiGroupBy = entry.getKey();
  202.            
  203.             if (!OpenSPCoop2Properties.getInstance().isControlloTrafficoGestorePolicyInMemoryHazelcastOneMapForeachPolicy()) {
  204.                 IDUnivocoGroupByPolicyMapId mapId = (IDUnivocoGroupByPolicyMapId) datiGroupBy;
  205.                 if(!this.uniqueIdMap_idActivePolicy.equals(mapId.getUniqueMapId())) {
  206.                     continue;
  207.                 }
  208.             }
  209.            
  210.             //System.out.println("ID["+datiGroupBy.hashCode()+"] ["+datiGroupBy.toString()+"] ["+datiGroupBy.toString(false)+"]");
  211.                    
  212.             bf.append(separatorGroups);
  213.             bf.append("\n");
  214.             bf.append(Costanti.LABEL_MODALITA_SINCRONIZZAZIONE).append(" ").append(this.type.toLabel());
  215.             bf.append("\n");
  216.             bf.append("Criterio di Collezionamento dei Dati\n");
  217.             bf.append(datiGroupBy.toString(true));
  218.             bf.append("\n");
  219. //          entry.getValue().checkDate(log, this.activePolicy); // imposta correttamente gli intervalli
  220. //          bf.append(entry.getValue().toString());
  221.             datiCollezionati.checkDate(log, this.activePolicy); // imposta correttamente gli intervalli
  222.             bf.append(datiCollezionati.toString());
  223.             bf.append("\n");
  224.         }

  225.         if(bf.length()<=0){
  226.             bf.append("Nessuna informazione disponibile");
  227.             return bf.toString();
  228.         }
  229.         else{
  230.             return bf.toString()+separatorGroups;
  231.         }
  232.     }
  233.    
  234.    
  235.     protected IDUnivocoGroupByPolicy augmentIDUnivoco(IDUnivocoGroupByPolicy idUnivoco) {
  236.         // utile sempre aggiungere un id per l'inizializzazione
  237.         if (OpenSPCoop2Properties.getInstance().isControlloTrafficoGestorePolicyInMemoryHazelcastOneMapForeachPolicy()) {
  238.             return idUnivoco;
  239.         } else {
  240.             if(idUnivoco instanceof IDUnivocoGroupByPolicyMapId) {
  241.                 return idUnivoco;
  242.             }
  243.             else {
  244.                 return new IDUnivocoGroupByPolicyMapId(idUnivoco, this.uniqueIdMap_idActivePolicy); // NOTA: non serve gestirlo all'interno poichè verrà creato un nuovo identificativo //, this.uniqueIdMap_updateTime);
  245.             }
  246.         }
  247.     }
  248.    
  249.    

  250. }