EndRequestProcessor.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.List;
  22. import java.util.Map.Entry;

  23. import org.openspcoop2.core.controllo_traffico.beans.ActivePolicy;
  24. import org.openspcoop2.core.controllo_traffico.beans.DatiCollezionati;
  25. import org.openspcoop2.core.controllo_traffico.beans.IDUnivocoGroupByPolicy;
  26. import org.openspcoop2.core.controllo_traffico.beans.MisurazioniTransazione;
  27. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  28. import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
  29. import org.openspcoop2.protocol.utils.EsitiProperties;
  30. import org.openspcoop2.utils.Map;
  31. import org.slf4j.Logger;

  32. import com.hazelcast.core.Offloadable;
  33. import com.hazelcast.map.EntryProcessor;

  34. /**    
  35.  *  L'EntryProcessor si esegue sul proprietario della chiave.
  36.  *  Implementando l'interfaccia Offloadable eseguiamo il task su un ExecutorService a parte, sbloccando altre operazioni
  37.  *   sulle chiavi della stessa partizione.
  38.  *  Utilizza il default ExecutionService.OFFLOADABLE_EXECUTOR, in questo modo solo la chiave viene lockata e non la partizione intera
  39.  *
  40.  * @author Francesco Scarlato (scarlato@link.it)
  41.  * @author $Author$
  42.  * @version $Rev$, $Date$
  43.  */
  44. public class EndRequestProcessor implements EntryProcessor<IDUnivocoGroupByPolicy, DatiCollezionati, Boolean>, Offloadable {
  45.    
  46.     private static final long serialVersionUID = 1L;
  47.     private final ActivePolicy activePolicy;
  48.    
  49.     private final MisurazioniTransazione dati;
  50.     private final Map<Object> ctx;
  51.     private final boolean isApplicabile;
  52.     private final boolean isViolata;

  53.     public EndRequestProcessor(ActivePolicy policy, Map<Object> ctx, MisurazioniTransazione dati, boolean isApplicabile, boolean isViolata) {
  54.         this.activePolicy = policy;
  55.         this.ctx = ctx;
  56.         this.dati = dati;
  57.         this.isApplicabile = isApplicabile;
  58.         this.isViolata = isViolata;
  59.     }
  60.    
  61.     @Override
  62.     public Boolean  process(Entry<IDUnivocoGroupByPolicy, DatiCollezionati> entry) {
  63.         //System.out.println("<"+idTransazione+"> registerStartRequest distribuita");
  64.         DatiCollezionati datiCollezionati = entry.getValue();
  65.         if(datiCollezionati == null) {
  66.             System.out.println("<"/*+idTransazione*/+">updateDatiStartRequestApplicabile Non sono presenti alcun threads registrati per la richiesta con dati identificativi ["+entry.getKey().toString()+"]");
  67.             return false;
  68.         }
  69.         OpenSPCoop2Properties op2Properties = OpenSPCoop2Properties.getInstance();
  70.         Logger log = OpenSPCoop2Logger.getLoggerOpenSPCoopControlloTraffico(op2Properties.isControlloTrafficoDebug());

  71.        
  72.         if(this.isApplicabile) {
  73.             datiCollezionati.registerEndRequest(log, this.activePolicy, this.ctx, this.dati);
  74.             List<Integer> esitiCodeOk = null;
  75.             List<Integer> esitiCodeKo_senzaFaultApplicativo = null;
  76.             List<Integer> esitiCodeFaultApplicativo = null;
  77.             try {
  78.                 // In queste tre di sotto pare il logger non venga utilizzato
  79.                 EsitiProperties esitiProperties = EsitiProperties.getInstanceFromProtocolName(log,this.dati.getProtocollo());
  80.                 esitiCodeOk = esitiProperties.getEsitiCodeOk_senzaFaultApplicativo();
  81.                 esitiCodeKo_senzaFaultApplicativo = esitiProperties.getEsitiCodeKo_senzaFaultApplicativo();
  82.                 esitiCodeFaultApplicativo = esitiProperties.getEsitiCodeFaultApplicativo();
  83.                 datiCollezionati.updateDatiEndRequestApplicabile(
  84.                         log,    // logger
  85.                         this.activePolicy, this.ctx, this.dati,
  86.                         esitiCodeOk,esitiCodeKo_senzaFaultApplicativo, esitiCodeFaultApplicativo,
  87.                         this.isViolata);
  88.             }catch(Exception e) {
  89.                 //throw new PolicyException(e.getMessage(),e); TODO: Ristabilire il comportamento corretto in questo caso, bisogna sollevare una eccezione nel nodo che ha chiamato questo processor
  90.                 System.out.println("<"/*+idTransazione*/+">EndRequestProcessor, errore sulla policy con dati identificativi ["+entry.getKey().toString()+"]: " + e.getMessage());
  91.                 return false;
  92.             }
  93.            
  94.             entry.setValue(datiCollezionati);
  95.         } else {
  96.             datiCollezionati.registerEndRequest(null, this.activePolicy, this.ctx, this.dati);
  97.             entry.setValue(datiCollezionati);
  98.         }
  99.        
  100.     return true;
  101. }
  102.    
  103.     @Override
  104.     public String getExecutorName() {
  105.         return "hz:offloadable";
  106.     }
  107. }