From 8c93d897cbd226d1d17e873dcc44178b5fef93f6 Mon Sep 17 00:00:00 2001 From: SamuelQuetin Date: Thu, 28 Mar 2024 16:01:13 +0100 Subject: [PATCH 1/8] =?UTF-8?q?gestion=20cas=20"Aucune=20notice=20ne=20cor?= =?UTF-8?q?respond=20=C3=A0=20la=20recherche"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/fr/abes/bestppn/service/WsService.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/java/fr/abes/bestppn/service/WsService.java b/src/main/java/fr/abes/bestppn/service/WsService.java index 2121ec1..ae97953 100644 --- a/src/main/java/fr/abes/bestppn/service/WsService.java +++ b/src/main/java/fr/abes/bestppn/service/WsService.java @@ -9,10 +9,12 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.lang.Nullable; import org.springframework.stereotype.Service; +import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; @@ -95,15 +97,18 @@ private ResultWsSudocDto getResultWsSudocDto(String type, String id, @Nullable S ResultWsSudocDto result = new ResultWsSudocDto(); try { result = mapper.readValue((provider != null && !provider.isEmpty()) ? getRestCall(url, type, id, provider) : getRestCall(url, type, id), ResultWsSudocDto.class); - } catch (RestClientException ex) { - log.info("URL : {} / id : {} / provider : {} : Erreur dans l'acces au webservice.", url, id, provider); - throw ex; - } catch (IllegalArgumentException ex) { - if (ex.getMessage().equals("argument \"content\" is null")) { + } catch (HttpClientErrorException ex) { + if (ex.getStatusCode() == HttpStatus.BAD_REQUEST && ex.getMessage().contains("Aucune notice ne correspond à la recherche")) { log.info("Aucuns ppn correspondant à l'identifiant " + id); } else { + log.info("URL : {} / id : {} / provider : {} : Erreur dans l'acces au webservice.", url, id, provider); throw ex; } + } catch (RestClientException ex) { + log.info("URL : {} / id : {} / provider : {} : Erreur dans l'acces au webservice.", url, id, provider); + throw ex; + } catch (IllegalArgumentException ex) { + throw ex; } catch (JsonProcessingException ex) { throw new RestClientException(ex.getMessage()); } finally { From 67de75bd9c632268f37e65d4bb6f0cc5cb82373a Mon Sep 17 00:00:00 2001 From: EryneKL <97091460+EryneKL@users.noreply.github.com> Date: Fri, 5 Apr 2024 15:35:13 +0200 Subject: [PATCH 2/8] FEAT : CDE-403-sur-un-gros-fichier-le-bad-ecrase-son-contenu-au-fil-du-traitement - ajout d'un sleep avant le log de fin de traitement --- src/main/java/fr/abes/bestppn/kafka/TopicConsumer.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/fr/abes/bestppn/kafka/TopicConsumer.java b/src/main/java/fr/abes/bestppn/kafka/TopicConsumer.java index 81c8673..a9e2b40 100644 --- a/src/main/java/fr/abes/bestppn/kafka/TopicConsumer.java +++ b/src/main/java/fr/abes/bestppn/kafka/TopicConsumer.java @@ -107,6 +107,8 @@ public void kbartFromkafkaListener(ConsumerRecord ligneKbart) { log.error(e.getMessage()); workInProgress.get(filename).addLineKbartToMailAttachementWithErrorMessage(ligneKbartDto, e.getMessage()); workInProgress.get(filename).addNbLinesWithErrorsInExecutionReport(); + } catch (InterruptedException e) { + throw new RuntimeException(e); } finally { //on ne décrémente pas le nb de thread si l'objet de suivi a été supprimé après la production des messages dans le second topic if (workInProgress.get(filename) != null) @@ -123,7 +125,7 @@ public void kbartFromkafkaListener(ConsumerRecord ligneKbart) { } - private void handleFichier(String filename) { + private void handleFichier(String filename) throws InterruptedException { //on attend que l'ensemble des threads aient terminé de travailler avant de lancer le commit do { try { @@ -151,13 +153,14 @@ private void handleFichier(String filename) { log.error("Le nom du fichier " + filename + " n'est pas correct. " + e); emailService.sendProductionErrorEmail(filename, e.getMessage()); } finally { + Thread.sleep(5000); // pour attendre que tous les threads de best-ppn-api aient terminé leurs traitements log.info("Traitement terminé pour fichier " + filename + " / nb lignes " + workInProgress.get(filename).incrementNbLignesTraiteesAndGet()); workInProgress.remove(filename); } } @KafkaListener(topics = {"${topic.name.source.kbart.errors}"}, groupId = "${topic.groupid.source.errors}", containerFactory = "kafkaKbartListenerContainerFactory") - public void errorsListener(ConsumerRecord error) { + public void errorsListener(ConsumerRecord error) throws InterruptedException { log.error(error.value()); String filename = error.key(); do { From 446a968805dc65d75c8fd834415206b15b0ff40e Mon Sep 17 00:00:00 2001 From: EryneKL <97091460+EryneKL@users.noreply.github.com> Date: Fri, 5 Apr 2024 16:25:21 +0200 Subject: [PATCH 3/8] FEAT : CDE-403-sur-un-gros-fichier-le-bad-ecrase-son-contenu-au-fil-du-traitement - surpression d'un sleep avant le log de fin de traitement --- src/main/java/fr/abes/bestppn/kafka/TopicConsumer.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/fr/abes/bestppn/kafka/TopicConsumer.java b/src/main/java/fr/abes/bestppn/kafka/TopicConsumer.java index a9e2b40..81c8673 100644 --- a/src/main/java/fr/abes/bestppn/kafka/TopicConsumer.java +++ b/src/main/java/fr/abes/bestppn/kafka/TopicConsumer.java @@ -107,8 +107,6 @@ public void kbartFromkafkaListener(ConsumerRecord ligneKbart) { log.error(e.getMessage()); workInProgress.get(filename).addLineKbartToMailAttachementWithErrorMessage(ligneKbartDto, e.getMessage()); workInProgress.get(filename).addNbLinesWithErrorsInExecutionReport(); - } catch (InterruptedException e) { - throw new RuntimeException(e); } finally { //on ne décrémente pas le nb de thread si l'objet de suivi a été supprimé après la production des messages dans le second topic if (workInProgress.get(filename) != null) @@ -125,7 +123,7 @@ public void kbartFromkafkaListener(ConsumerRecord ligneKbart) { } - private void handleFichier(String filename) throws InterruptedException { + private void handleFichier(String filename) { //on attend que l'ensemble des threads aient terminé de travailler avant de lancer le commit do { try { @@ -153,14 +151,13 @@ private void handleFichier(String filename) throws InterruptedException { log.error("Le nom du fichier " + filename + " n'est pas correct. " + e); emailService.sendProductionErrorEmail(filename, e.getMessage()); } finally { - Thread.sleep(5000); // pour attendre que tous les threads de best-ppn-api aient terminé leurs traitements log.info("Traitement terminé pour fichier " + filename + " / nb lignes " + workInProgress.get(filename).incrementNbLignesTraiteesAndGet()); workInProgress.remove(filename); } } @KafkaListener(topics = {"${topic.name.source.kbart.errors}"}, groupId = "${topic.groupid.source.errors}", containerFactory = "kafkaKbartListenerContainerFactory") - public void errorsListener(ConsumerRecord error) throws InterruptedException { + public void errorsListener(ConsumerRecord error) { log.error(error.value()); String filename = error.key(); do { From 6595999fc135ccf66ab621f1cb4201a42053729a Mon Sep 17 00:00:00 2001 From: SamuelQuetin Date: Tue, 9 Apr 2024 11:10:28 +0200 Subject: [PATCH 4/8] refactor catch inutile --- src/main/java/fr/abes/bestppn/service/WsService.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/fr/abes/bestppn/service/WsService.java b/src/main/java/fr/abes/bestppn/service/WsService.java index ae97953..a49acc2 100644 --- a/src/main/java/fr/abes/bestppn/service/WsService.java +++ b/src/main/java/fr/abes/bestppn/service/WsService.java @@ -107,8 +107,6 @@ private ResultWsSudocDto getResultWsSudocDto(String type, String id, @Nullable S } catch (RestClientException ex) { log.info("URL : {} / id : {} / provider : {} : Erreur dans l'acces au webservice.", url, id, provider); throw ex; - } catch (IllegalArgumentException ex) { - throw ex; } catch (JsonProcessingException ex) { throw new RestClientException(ex.getMessage()); } finally { From 5a2cacfb8a2a5711da21f5ca7882414d7effa1da Mon Sep 17 00:00:00 2001 From: SamuelQuetin Date: Thu, 11 Apr 2024 14:40:00 +0200 Subject: [PATCH 5/8] refactor rename isforced --- src/main/java/fr/abes/bestppn/service/BestPpnService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/fr/abes/bestppn/service/BestPpnService.java b/src/main/java/fr/abes/bestppn/service/BestPpnService.java index 96fe6f2..b44e0ef 100644 --- a/src/main/java/fr/abes/bestppn/service/BestPpnService.java +++ b/src/main/java/fr/abes/bestppn/service/BestPpnService.java @@ -51,7 +51,7 @@ public BestPpnService(WsService service, NoticeService noticeService, TopicProdu this.checkUrlService = checkUrlService; } - public BestPpn getBestPpn(LigneKbartDto kbart, String provider, boolean injectKafka, boolean isSendLogs) throws IOException, BestPpnException, URISyntaxException, RestClientException, IllegalArgumentException, IllegalDoiException { + public BestPpn getBestPpn(LigneKbartDto kbart, String provider, boolean isForced, boolean isSendLogs) throws IOException, BestPpnException, URISyntaxException, RestClientException, IllegalArgumentException, IllegalDoiException { List messages = new ArrayList<>(); Map ppnElecScoredList = new HashMap<>(); Set ppnPrintResultList = new HashSet<>(); @@ -76,7 +76,7 @@ public BestPpn getBestPpn(LigneKbartDto kbart, String provider, boolean injectKa feedPpnListFromDat(kbart, ppnElecScoredList, ppnPrintResultList, provider, isSendLogs, messages); } - return getBestPpnByScore(kbart, ppnElecScoredList, ppnPrintResultList, injectKafka, isSendLogs, messages); + return getBestPpnByScore(kbart, ppnElecScoredList, ppnPrintResultList, isForced, isSendLogs, messages); } private void feedPpnListFromOnline(LigneKbartDto kbart, String provider, Map ppnElecScoredList, Set ppnPrintResultList, boolean isSendLogs, List messages) throws IOException, URISyntaxException, IllegalArgumentException, BestPpnException { From 6167a80a17ffb5649f700a2b141c5f1ea5c7e501 Mon Sep 17 00:00:00 2001 From: SamuelQuetin Date: Thu, 11 Apr 2024 14:40:43 +0200 Subject: [PATCH 6/8] refactor camelCase --- src/main/java/fr/abes/bestppn/kafka/KafkaWorkInProgress.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/fr/abes/bestppn/kafka/KafkaWorkInProgress.java b/src/main/java/fr/abes/bestppn/kafka/KafkaWorkInProgress.java index 80e3dc2..f7a2c23 100644 --- a/src/main/java/fr/abes/bestppn/kafka/KafkaWorkInProgress.java +++ b/src/main/java/fr/abes/bestppn/kafka/KafkaWorkInProgress.java @@ -72,7 +72,7 @@ public int getNbActiveThreads() { return this.nbActiveThreads.get(); } - public int incrementNbLignesTraiteesAndGet() { + public int incrementnbLignesTraiteesAndGet() { return this.nbLignesTraitees.incrementAndGet(); } From 6b4acdb6c569649368b22427679e9a7516ecc25c Mon Sep 17 00:00:00 2001 From: SamuelQuetin Date: Thu, 11 Apr 2024 14:41:47 +0200 Subject: [PATCH 7/8] refactor camelCase --- src/main/java/fr/abes/bestppn/kafka/KafkaWorkInProgress.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/fr/abes/bestppn/kafka/KafkaWorkInProgress.java b/src/main/java/fr/abes/bestppn/kafka/KafkaWorkInProgress.java index f7a2c23..80e3dc2 100644 --- a/src/main/java/fr/abes/bestppn/kafka/KafkaWorkInProgress.java +++ b/src/main/java/fr/abes/bestppn/kafka/KafkaWorkInProgress.java @@ -72,7 +72,7 @@ public int getNbActiveThreads() { return this.nbActiveThreads.get(); } - public int incrementnbLignesTraiteesAndGet() { + public int incrementNbLignesTraiteesAndGet() { return this.nbLignesTraitees.incrementAndGet(); } From e1901ef04040c850f9b2f26ac56ce8f7d8c5d57e Mon Sep 17 00:00:00 2001 From: SamuelQuetin Date: Thu, 11 Apr 2024 14:43:06 +0200 Subject: [PATCH 8/8] =?UTF-8?q?Fix=20handle=20fichier=20pour=20envoy=C3=A9?= =?UTF-8?q?=20un=20mail=20dans=20tout=20les=20cas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/abes/bestppn/kafka/TopicConsumer.java | 46 +++++++++---------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/src/main/java/fr/abes/bestppn/kafka/TopicConsumer.java b/src/main/java/fr/abes/bestppn/kafka/TopicConsumer.java index 81c8673..36bf791 100644 --- a/src/main/java/fr/abes/bestppn/kafka/TopicConsumer.java +++ b/src/main/java/fr/abes/bestppn/kafka/TopicConsumer.java @@ -82,6 +82,19 @@ public void kbartFromkafkaListener(ConsumerRecord ligneKbart) { String origineNbCurrentLine = new String(ligneKbart.headers().lastHeader("nbCurrentLines").value()); ThreadContext.put("package", (filename + ";" + origineNbCurrentLine)); //Ajoute le nom de fichier dans le contexte du thread pour log4j service.processConsumerRecord(ligneKbartDto, providerName, workInProgress.get(filename).isForced(), workInProgress.get(filename).isBypassed(), filename); + } catch (IOException | URISyntaxException | RestClientException | IllegalDoiException e) { + //erreurs non bloquantes, on n'arrête pas le programme + log.warn(e.getMessage()); + ligneKbartDto.setErrorType(e.getMessage()); + workInProgress.get(filename).addNbLinesWithInputDataErrorsInExecutionReport(); + } catch (BestPpnException e) { + if (!workInProgress.get(filename).isForced()) { + workInProgress.get(filename).setIsOnError(true); + } + log.error(e.getMessage()); + ligneKbartDto.setErrorType(e.getMessage()); + workInProgress.get(filename).addNbLinesWithErrorsInExecutionReport(); + } finally { if (ligneKbartDto.getBestPpn() != null && !ligneKbartDto.getBestPpn().isEmpty()) workInProgress.get(filename).addNbBestPpnFindedInExecutionReport(); workInProgress.get(filename).addLineKbartToMailAttachment(ligneKbartDto); @@ -89,37 +102,24 @@ public void kbartFromkafkaListener(ConsumerRecord ligneKbart) { if (lastHeader != null) { int nbLignesTotal = Integer.parseInt(new String(lastHeader.value())); if (nbLignesTotal == workInProgress.get(filename).incrementNbLignesTraiteesAndGet()) { + if (workInProgress.get(filename).getSemaphore().tryAcquire()) { workInProgress.get(filename).setNbtotalLinesInExecutionReport(nbLignesTotal); handleFichier(filename); } } } - } catch (IOException | URISyntaxException | RestClientException | IllegalDoiException e) { - //erreurs non bloquantes, on n'arrête pas le programme - log.warn(e.getMessage()); - workInProgress.get(filename).addLineKbartToMailAttachementWithErrorMessage(ligneKbartDto, e.getMessage()); - workInProgress.get(filename).addNbLinesWithInputDataErrorsInExecutionReport(); - } catch (BestPpnException e) { - if (!workInProgress.get(filename).isForced()) { - workInProgress.get(filename).setIsOnError(true); - } - log.error(e.getMessage()); - workInProgress.get(filename).addLineKbartToMailAttachementWithErrorMessage(ligneKbartDto, e.getMessage()); - workInProgress.get(filename).addNbLinesWithErrorsInExecutionReport(); - } finally { //on ne décrémente pas le nb de thread si l'objet de suivi a été supprimé après la production des messages dans le second topic if (workInProgress.get(filename) != null) workInProgress.get(filename).decrementThreads(); } }); - } catch(IllegalProviderException | JsonProcessingException e){ - workInProgress.get(filename).setIsOnError(true); - log.warn(e.getMessage()); - workInProgress.get(filename).addLineKbartToMailAttachementWithErrorMessage(new LigneKbartDto(), e.getMessage()); - workInProgress.get(filename).addNbLinesWithInputDataErrorsInExecutionReport(); - } - + } catch(IllegalProviderException | JsonProcessingException e){ + workInProgress.get(filename).setIsOnError(true); + log.warn(e.getMessage()); + workInProgress.get(filename).addLineKbartToMailAttachementWithErrorMessage(new LigneKbartDto(), e.getMessage()); + workInProgress.get(filename).addNbLinesWithInputDataErrorsInExecutionReport(); + } } @@ -135,9 +135,7 @@ private void handleFichier(String filename) { } } while (workInProgress.get(filename).getNbActiveThreads() > 1); try { - if (workInProgress.get(filename).isOnError()) { - log.error("Fichier " + filename + " : Une erreur s'est produite dans le traitement du fichier"); - } else { + if (!workInProgress.get(filename).isOnError()) { String providerName = Utils.extractProvider(filename); service.commitDatas(providerName, filename); //quel que soit le résultat du traitement, on envoie le rapport par mail @@ -151,7 +149,7 @@ private void handleFichier(String filename) { log.error("Le nom du fichier " + filename + " n'est pas correct. " + e); emailService.sendProductionErrorEmail(filename, e.getMessage()); } finally { - log.info("Traitement terminé pour fichier " + filename + " / nb lignes " + workInProgress.get(filename).incrementNbLignesTraiteesAndGet()); + log.info("Traitement terminé pour fichier " + filename + " / nb lignes " + workInProgress.get(filename).getNbLignesTraitees()); workInProgress.remove(filename); } }