Skip to content

Commit

Permalink
Corretti errore di gestione del parallelismo elaborazione tracciati.
Browse files Browse the repository at this point in the history
  • Loading branch information
pintorig committed Feb 25, 2021
1 parent e039c1e commit 75f8010
Show file tree
Hide file tree
Showing 13 changed files with 287 additions and 53 deletions.
@@ -0,0 +1,5 @@
idA2A,idPendenza,idDominio,numeroAvviso,tipoPendenza,idUnitaOperativa,causale,annoRiferimento,cartellaPagamento,datiAllegati,direzione,divisione,importo,dataValidita,dataScadenza,tassonomiaAvviso,tipoSoggettoPagatore,identificativoPagatore,anagraficaPagatore,indirizzoPagatore,civicoPagatore,capPagatore,localitaPagatore,provinciaPagatore,nazionePagatore,emailPagatore,cellularePagatore,idVoce1,importoVoce1,descrizioneVoce1,ibanAccreditoVoce1,ibanAppoggioVoce1,tipoContabilitaVoce1,codiceContabilitaVoce1,tipoEntrataVoce1,tipoBolloVoce1,hashBolloVoce1,provinciaBolloVoce1,idVoce2,importoVoce2,descrizioneVoce2,ibanAccreditoVoce2,ibanAppoggioVoce2,tipoContabilitaVoce2,codiceContabilitaVoce2,tipoEntrataVoce2,tipoBolloVoce2,hashBolloVoce2,provinciaBolloVoce2,idVoce3,importoVoce3,descrizioneVoce3,ibanAccreditoVoce3,ibanAppoggioVoce3,tipoContabilitaVoce3,codiceContabilitaVoce3,tipoEntrataVoce3,tipoBolloVoce3,hashBolloVoce3,provinciaBolloVoce3,idVoce4,importoVoce4,descrizioneVoce4,ibanAccreditoVoce4,ibanAppoggioVoce4,tipoContabilitaVoce4,codiceContabilitaVoce4,tipoEntrataVoce4,tipoBolloVoce4,hashBolloVoce4,provinciaBolloVoce4,idVoce5,importoVoce5,descrizioneVoce5,ibanAccreditoVoce5,ibanAppoggioVoce5,tipoContabilitaVoce5,codiceContabilitaVoce5,tipoEntrataVoce5,tipoBolloVoce5,hashBolloVoce5,provinciaBolloVoce5
{idA2A},{idPendenza}-1,,,,,,,,,,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
{idA2A},{idPendenza}-2,,,,,,,,,,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
{idA2A},{idPendenza}-3,,,,,,,,,,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
{idA2A},{idPendenza}-4,,,,,,,,,,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Expand Up @@ -2,8 +2,4 @@ idA2A,idPendenza,idDominio,numeroAvviso,tipoPendenza,idUnitaOperativa,causale,an
{idA2A},{idPendenza}-1,{idDominio},,{tipoPendenza},,Tassa Passo Carrabile n. abc00000,2010,CRT-001,"{ ""foo"": ""baz"", ""bar"": true }",,,{importo},2019-12-30,2020-12-30,Servizi erogati da altri enti,F,DRCGNN12A46A326K,Giovanna D'Arco,Viale Monterosa,11Bis,340,Roma,RM,IT,laPulzelladOrleans@yahoo.fr,,1,{importo_voce},Tassa Passo Carrabile n. abc00000,{ibanAccredito},,ALTRO,CodiceContabilita,,,,,2,{importo_voce},Marca,,,,,,01,a/CWqtFtCEyA/ymBySahGSaqKMiak5mlX3BoX0jupy8=,FI,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
{idA2A},{idPendenza}-2,{idDominio},,{tipoPendenza},,Tassa Passo Carrabile n. abc00000,2010,CRT-001,"{ ""foo"": ""baz"", ""bar"": true }",,,{importo},2019-12-30,2020-12-30,Servizi erogati da altri enti,F,DRCGNN12A46A326K,Giovanna D'Arco,Viale Monterosa,11Bis,340,Roma,RM,IT,laPulzelladOrleans@yahoo.fr,,1,{importo},Tassa Passo Carrabile n. abc00000,{ibanAccredito},,ALTRO,CodiceContabilita,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
{idA2A},{idPendenza}-3,{idDominio},{numeroAvviso},{tipoPendenza},,Tassa Passo Carrabile n. abc00000,2010,CRT-001,"{ ""foo"": ""baz"", ""bar"": true }",,,{importo},2019-12-30,2020-12-30,Servizi erogati da altri enti,F,DRCGNN12A46A326K,Giovanna D'Arco,Viale Monterosa,11Bis,340,Roma,RM,IT,laPulzelladOrleans@yahoo.fr,,1,{importo},Tassa Passo Carrabile n. abc00000,{ibanAccredito},,ALTRO,CodiceContabilita,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
{idA2A},{idPendenza}-4,{idDominio},,{tipoPendenza},,Tassa Passo Carrabile n. abc00000,2010,CRT-001,"{ ""foo"": ""baz"", ""bar"": true }",,,{importo},2019-12-30,2020-12-30,Servizi erogati da altri enti,F,DRCGNN12A46A326K,Giovanna D'Arco,Viale Monterosa,11Bis,340,Roma,RM,IT,laPulzelladOrleans@yahoo.fr,,1,{importo},Tassa Passo Carrabile n. abc00000,{ibanAccredito},{ibanAppoggio},ALTRO,CodiceContabilita,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
{idA2A},{idPendenza}-1,,,,,,,,,,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
{idA2A},{idPendenza}-2,,,,,,,,,,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
{idA2A},{idPendenza}-3,,,,,,,,,,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
{idA2A},{idPendenza}-4,,,,,,,,,,,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
{idA2A},{idPendenza}-4,{idDominio},,{tipoPendenza},,Tassa Passo Carrabile n. abc00000,2010,CRT-001,"{ ""foo"": ""baz"", ""bar"": true }",,,{importo},2019-12-30,2020-12-30,Servizi erogati da altri enti,F,DRCGNN12A46A326K,Giovanna D'Arco,Viale Monterosa,11Bis,340,Roma,RM,IT,laPulzelladOrleans@yahoo.fr,,1,{importo},Tassa Passo Carrabile n. abc00000,{ibanAccredito},{ibanAppoggio},ALTRO,CodiceContabilita,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Expand Up @@ -155,12 +155,12 @@ When method get
Given url backofficeBaseurl
And path 'pendenze', 'tracciati', idTracciato
And headers basicAutenticationHeader
And retry until response.stato == 'ESEGUITO'
And retry until response.stato == 'ESEGUITO_CON_ERRORI'
When method get
Then match response contains { descrizioneStato: '##null' }
Then match response.numeroOperazioniTotali == 2
Then match response.numeroOperazioniEseguite == 2
Then match response.numeroOperazioniFallite == 0
Then match response.numeroOperazioniEseguite == 1
Then match response.numeroOperazioniFallite == 1

Given url backofficeBaseurl
And path 'pendenze', 'tracciati', idTracciato, 'stampe'
Expand Down Expand Up @@ -1193,7 +1193,7 @@ Then status 200

# ripeto il caricamento

* def tracciato2 = karate.readAsString('classpath:test/api/backoffice/v1/tracciati/post/msg/tracciato-pendenze-v3.csv')
* def tracciato2 = karate.readAsString('classpath:test/api/backoffice/v1/tracciati/post/msg/tracciato-pendenze-v2.csv')
* def tracciato2 = replace(tracciato2,"{idA2A}", idA2A);
* def tracciato2 = replace(tracciato2,"{idPendenza}", idPendenza);
* def tracciato2 = replace(tracciato2,"{idDominio}", idDominio);
Expand Down Expand Up @@ -1389,8 +1389,8 @@ And headers basicAutenticationHeader
And retry until response.stato == 'ESEGUITO'
When method get
Then match response contains { descrizioneStato: '##null' }
Then match response.numeroOperazioniTotali == 8
Then match response.numeroOperazioniEseguite == 8
Then match response.numeroOperazioniTotali == 4
Then match response.numeroOperazioniEseguite == 4
Then match response.numeroOperazioniFallite == 0

Given url backofficeBaseurl
Expand All @@ -1411,3 +1411,53 @@ And headers basicAutenticationHeader
When method get
Then status 200

* def tracciato = karate.readAsString('classpath:test/api/backoffice/v1/tracciati/post/msg/tracciato-pendenze-annullamento-del.csv')
* def tracciato = replace(tracciato,"{idA2A}", idA2A);
* def tracciato = replace(tracciato,"{idPendenza}", idPendenza);
* def tracciato = replace(tracciato,"{idDominio}", idDominio);
* def tracciato = replace(tracciato,"{numeroAvviso}", numeroAvviso);
* def tracciato = replace(tracciato,"{ibanAccredito}", ibanAccredito);
* def tracciato = replace(tracciato,"{ibanAppoggio}", ibanAccreditoPostale);
* def tracciato = replace(tracciato,"{tipoPendenza}", codEntrataSegreteria);
* def tracciato = replace(tracciato,"{importo}", importo);
* def tracciato = replace(tracciato,"{importo_voce}", importo_voce);

Given url backofficeBaseurl
And path 'pendenze', 'tracciati', idDominio, codEntrataSegreteria
And headers { 'Content-Type' : 'text/csv' }
And headers basicAutenticationHeader
And request tracciato
When method post
Then status 201

* def idTracciato = response.id

Given url backofficeBaseurl
And path 'operazioni', 'elaborazioneTracciatiPendenze'
And headers basicAutenticationHeader
When method get

Given url backofficeBaseurl
And path 'pendenze', 'tracciati', idTracciato
And headers basicAutenticationHeader
And retry until response.stato == 'ESEGUITO'
When method get
Then match response contains { descrizioneStato: '##null' }
Then match response.numeroOperazioniTotali == 4
Then match response.numeroOperazioniEseguite == 4
Then match response.numeroOperazioniFallite == 0

Given url backofficeBaseurl
And path 'pendenze', 'tracciati', idTracciato, 'richiesta'
And headers basicAutenticationHeader
When method get
Then status 200

Given url backofficeBaseurl
And path 'pendenze', 'tracciati', idTracciato, 'esito'
And headers basicAutenticationHeader
When method get
Then status 200



15 changes: 10 additions & 5 deletions jars/core/src/main/java/it/govpay/core/business/Tracciati.java
Expand Up @@ -97,6 +97,7 @@
import it.govpay.core.utils.thread.CaricamentoTracciatoThread;
import it.govpay.core.utils.thread.CreaStampeTracciatoThread;
import it.govpay.core.utils.thread.ThreadExecutorManager;
import it.govpay.core.utils.tracciati.TracciatiPendenzeManager;
import it.govpay.core.utils.tracciati.TracciatiUtils;
import it.govpay.model.Operazione.StatoOperazioneType;
import it.govpay.model.Operazione.TipoOperazioneType;
Expand Down Expand Up @@ -167,6 +168,7 @@ public void elaboraTracciatoPendenze(ElaboraTracciatoDTO elaboraTracciatoDTO, IC
beanDati.setNumAddTotali(0);
beanDati.setNumDelTotali(0);
beanDati.setDescrizioneStepElaborazione(descrizioneStato);
beanDati.setDataUltimoAggiornamento(new Date());
try {
tracciato.setBeanDati(serializer.getObject(beanDati));
} catch (IOException e1) {}
Expand Down Expand Up @@ -202,7 +204,7 @@ private void _elaboraTracciatoJSON(TracciatiBD tracciatiBD, Tracciato tracciato,
ModalitaAvvisaturaDigitale modalitaAvvisaturaDigitale = tracciatoPendenzeRequest.getModalitaAvvisaturaDigitale();
String modo = (modalitaAvvisaturaDigitale != null && modalitaAvvisaturaDigitale.equals(ModalitaAvvisaturaDigitale.SINCRONA)) ? "S" : "A";
beanDati.setAvvisaturaModalita(modo);

beanDati.setDataUltimoAggiornamento(new Date());
tracciato.setBeanDati(serializer.getObject(beanDati));
tracciatiBD.updateBeanDati(tracciato);
tracciatiBD.commit();
Expand Down Expand Up @@ -512,7 +514,7 @@ private void _elaboraTracciatoJSON(TracciatiBD tracciatiBD, Tracciato tracciato,
}finally {

}

beanDati.setDataUltimoAggiornamento(new Date());
tracciato.setStato(STATO_ELABORAZIONE.COMPLETATO);
tracciato.setDataCompletamento(new Date());
tracciato.setBeanDati(serializer.getObject(beanDati));
Expand Down Expand Up @@ -540,6 +542,7 @@ private void _elaboraTracciatoCSV(TracciatiBD tracciatiBD, Tracciato tracciato,
log.debug("Numero linee totali compresa intestazione ["+numLines+"]");
beanDati.setNumAddTotali(numLines > 0 ? (numLines -1) : 0);
beanDati.setNumDelTotali(0);
beanDati.setDataUltimoAggiornamento(new Date());
tracciato.setBeanDati(serializer.getObject(beanDati));

tracciatiBD.updateBeanDati(tracciato);
Expand Down Expand Up @@ -599,6 +602,8 @@ private void _elaboraTracciatoCSV(TracciatiBD tracciatiBD, Tracciato tracciato,
idTracciato.setIdTracciato(tracciato.getId());

List<CaricamentoRequest> richiesteThread = new ArrayList<>();

TracciatiPendenzeManager manager = new TracciatiPendenzeManager();

for(int i = 0; i < lst.size() ; i ++) {
byte[] linea = lst.get(i);
Expand All @@ -620,7 +625,7 @@ private void _elaboraTracciatoCSV(TracciatiBD tracciatiBD, Tracciato tracciato,
richiesteThread.add(request);

if(richiesteThread.size() == maxRichiestePerThread) {
CaricamentoTracciatoThread sender = new CaricamentoTracciatoThread(richiesteThread, idTracciato,ctx);
CaricamentoTracciatoThread sender = new CaricamentoTracciatoThread(richiesteThread, idTracciato, manager, ctx);
ThreadExecutorManager.getClientPoolExecutorCaricamentoTracciati().execute(sender);
threads.add(sender);
richiesteThread = new ArrayList<CaricamentoRequest>();
Expand All @@ -631,7 +636,7 @@ private void _elaboraTracciatoCSV(TracciatiBD tracciatiBD, Tracciato tracciato,

// richieste residue
if(richiesteThread.size() > 0) {
CaricamentoTracciatoThread sender = new CaricamentoTracciatoThread(richiesteThread, idTracciato,ctx);
CaricamentoTracciatoThread sender = new CaricamentoTracciatoThread(richiesteThread, idTracciato, manager, ctx);
ThreadExecutorManager.getClientPoolExecutorCaricamentoTracciati().execute(sender);
threads.add(sender);
}
Expand Down Expand Up @@ -886,7 +891,7 @@ private void _elaboraTracciatoCSV(TracciatiBD tracciatiBD, Tracciato tracciato,
}finally {

}

beanDati.setDataUltimoAggiornamento(new Date());
tracciato.setStato(STATO_ELABORAZIONE.COMPLETATO);
tracciato.setDataCompletamento(new Date());
tracciato.setBeanDati(serializer.getObject(beanDati));
Expand Down
Expand Up @@ -59,6 +59,7 @@
import it.govpay.core.utils.IuvUtils;
import it.govpay.core.utils.SimpleDateFormatUtils;
import it.govpay.core.utils.VersamentoUtils;
import it.govpay.core.utils.tracciati.TracciatiPendenzeManager;
import it.govpay.core.utils.tracciati.TracciatiUtils;
import it.govpay.core.utils.validator.PendenzaPostValidator;
import it.govpay.model.Operazione.StatoOperazioneType;
Expand Down Expand Up @@ -441,7 +442,7 @@ public AnnullamentoResponse annullaVersamento(AnnullamentoRequest request, Basic
}


public AbstractOperazioneResponse elaboraLineaCSV(CaricamentoRequest request, BasicBD basicBD) {
public AbstractOperazioneResponse elaboraLineaCSV(CaricamentoRequest request, TracciatiPendenzeManager manager, BasicBD basicBD) {
BDConfigWrapper configWrapper = new BDConfigWrapper(ContextThreadLocal.get().getTransactionId(), true);
AbstractOperazioneResponse operazioneResponse = new CaricamentoResponse();
operazioneResponse.setNumero(request.getLinea());
Expand All @@ -452,12 +453,15 @@ public AbstractOperazioneResponse elaboraLineaCSV(CaricamentoRequest request, Ba
operazioneResponse.setJsonRichiesta(request.getDati() == null || request.getDati().length == 0 ? "" : new String(request.getDati()));

try {
log.debug("AAAAAA " +Thread.currentThread().getName() + ": Numero Linea ["+request.getLinea() +"], Dati ["+operazioneResponse.getJsonRichiesta()+"]");
if(request.getDati() == null || request.getDati().length == 0) throw new ValidationException("Record vuoto");

TrasformazioneDTOResponse trasformazioneResponse = TracciatiUtils.trasformazioneInputCSV(log, request.getCodDominio(), request.getCodTipoVersamento(), new String(request.getDati()), request.getTipoTemplateTrasformazioneRichiesta() , request.getTemplateTrasformazioneRichiesta() );

operazioneResponse.setJsonRichiesta(trasformazioneResponse.getOutput());

log.debug("AAAAAA " +Thread.currentThread().getName() + ": Operazione da eseguire ["+trasformazioneResponse.getTipoOperazione()+"]");

Versamento versamento = new Versamento();
if(trasformazioneResponse.getTipoOperazione() == null || trasformazioneResponse.getTipoOperazione().equals(TipoOperazioneType.ADD)) {
CaricamentoResponse caricamentoResponse = (CaricamentoResponse) operazioneResponse;
Expand All @@ -468,6 +472,16 @@ public AbstractOperazioneResponse elaboraLineaCSV(CaricamentoRequest request, Ba

new PendenzaPostValidator(pendenzaPost).validate();

if(manager.checkPendenza(pendenzaPost.getIdA2A(), pendenzaPost.getIdPendenza())) {
throw new ValidationException("Pendenza [IdA2A:"+pendenzaPost.getIdA2A()+", IdPendenza:"+pendenzaPost.getIdPendenza()+"], e' duplicata all'interno del tracciato.");
}

manager.addPendenza(pendenzaPost.getIdA2A(), pendenzaPost.getIdPendenza());

if(pendenzaPost.getDocumento() != null) { //attesa primo inserimento documento
manager.getDocumento(pendenzaPost.getIdA2A(), pendenzaPost.getDocumento().getIdentificativo());
}

it.govpay.core.dao.commons.Versamento versamentoToAdd = it.govpay.core.utils.TracciatiConverter.getVersamentoFromPendenza(pendenzaPost);

// 12/12/2019 codDominio e codTipoVersamento sono settati nella trasformazione
Expand All @@ -493,6 +507,11 @@ public AbstractOperazioneResponse elaboraLineaCSV(CaricamentoRequest request, Ba
caricamentoResponse.setEsito(CaricamentoResponse.ESITO_ADD_OK);
caricamentoResponse.setIdVersamento(versamentoModel.getId());


if(pendenzaPost.getDocumento() != null) { // sblocco thread che attendono il documento
manager.releaseDocumento(pendenzaPost.getIdA2A(), pendenzaPost.getDocumento().getIdentificativo());
}

Avviso avviso = new Avviso();

if(versamentoModel.getCausaleVersamento()!= null) {
Expand Down
Expand Up @@ -541,15 +541,15 @@ public void readProperties() throws Exception {

String numeroVersamentiPerThreadString = getProperty("it.govpay.batch.caricamentoTracciati.numeroVersamentiPerThread", this.props, false, log);
try{
this.batchCaricamentoTracciatiNumeroVersamentiDaCaricarePerThread = Integer.parseInt(numeroVersamentiPerThreadString) * 1000;
this.batchCaricamentoTracciatiNumeroVersamentiDaCaricarePerThread = Integer.parseInt(numeroVersamentiPerThreadString);
} catch(Throwable t) {
log.info("Proprieta \"it.govpay.batch.caricamentoTracciati.numeroVersamentiPerThread\" impostata com valore di default 100");
this.batchCaricamentoTracciatiNumeroVersamentiDaCaricarePerThread = 100;
}

String numeroStampePerThreadString = getProperty("it.govpay.batch.caricamentoTracciati.numeroAvvisiDaStamparePerThread", this.props, false, log);
try{
this.batchCaricamentoTracciatiNumeroAvvisiDaStamparePerThread = Integer.parseInt(numeroStampePerThreadString) * 1000;
this.batchCaricamentoTracciatiNumeroAvvisiDaStamparePerThread = Integer.parseInt(numeroStampePerThreadString);
} catch(Throwable t) {
log.info("Proprieta \"it.govpay.batch.caricamentoTracciati.numeroAvvisiDaStamparePerThread\" impostata com valore di default 100");
this.batchCaricamentoTracciatiNumeroAvvisiDaStamparePerThread = 100;
Expand Down
Expand Up @@ -20,6 +20,7 @@
import it.govpay.core.business.model.tracciati.operazioni.CaricamentoRequest;
import it.govpay.core.business.model.tracciati.operazioni.CaricamentoResponse;
import it.govpay.core.business.model.tracciati.operazioni.OperazioneFactory;
import it.govpay.core.utils.tracciati.TracciatiPendenzeManager;
import it.govpay.core.utils.tracciati.TracciatiUtils;
import it.govpay.model.Operazione.StatoOperazioneType;
import it.govpay.model.Operazione.TipoOperazioneType;
Expand All @@ -39,11 +40,13 @@ public class CaricamentoTracciatoThread implements Runnable {
private String descrizioneEsito = null;
private List<AbstractOperazioneResponse> risposte = null;
private IContext ctx = null;
private TracciatiPendenzeManager manager = null;

public CaricamentoTracciatoThread(List<CaricamentoRequest> richieste, IdTracciato idTracciato, IContext ctx) {
public CaricamentoTracciatoThread(List<CaricamentoRequest> richieste, IdTracciato idTracciato, TracciatiPendenzeManager manager, IContext ctx) {
this.richieste = richieste;
this.idTracciato = idTracciato;
this.ctx = ctx;
this.manager = manager;
}

@Override
Expand Down Expand Up @@ -78,7 +81,7 @@ public void run() {
created = true;
}

AbstractOperazioneResponse operazioneResponse = factory.elaboraLineaCSV(request, operazioniBD);
AbstractOperazioneResponse operazioneResponse = factory.elaboraLineaCSV(request, this.manager, operazioniBD);

operazione.setCodVersamentoEnte(operazioneResponse.getIdPendenza());
operazione.setDatiRichiesta(operazioneResponse.getJsonRichiesta().getBytes());
Expand Down

0 comments on commit 75f8010

Please sign in to comment.