diff --git a/pom.xml b/pom.xml index 4aafb71..9ad72e1 100644 --- a/pom.xml +++ b/pom.xml @@ -98,7 +98,7 @@ com.oracle.database.jdbc ojdbc8 - 21.3.0.0 + 21.9.0.0 diff --git a/src/main/java/fr/abes/logskbart/kafka/KbartListener.java b/src/main/java/fr/abes/logskbart/kafka/KbartListener.java index c5f9bda..d645735 100644 --- a/src/main/java/fr/abes/logskbart/kafka/KbartListener.java +++ b/src/main/java/fr/abes/logskbart/kafka/KbartListener.java @@ -19,6 +19,9 @@ @Service @Slf4j public class KbartListener { + + // TODO Supprimer ce listener + @Autowired private ObjectMapper mapper; diff --git a/src/main/java/fr/abes/logskbart/kafka/LogsListener.java b/src/main/java/fr/abes/logskbart/kafka/LogsListener.java index f6f2726..ceb6f9c 100644 --- a/src/main/java/fr/abes/logskbart/kafka/LogsListener.java +++ b/src/main/java/fr/abes/logskbart/kafka/LogsListener.java @@ -1,19 +1,26 @@ package fr.abes.logskbart.kafka; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import fr.abes.logskbart.dto.Kbart2KafkaDto; import fr.abes.logskbart.entity.logs.LogKbart; import fr.abes.logskbart.repository.logs.LogKbartRepository; import fr.abes.logskbart.utils.UtilsMapper; +import lombok.extern.slf4j.Slf4j; import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.apache.kafka.common.header.Header; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.kafka.annotation.KafkaListener; import org.springframework.stereotype.Service; +import java.io.IOException; +import java.nio.file.*; import java.sql.Date; import java.sql.Timestamp; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +@Slf4j @Service public class LogsListener { @@ -26,13 +33,70 @@ public class LogsListener { @Autowired private LogKbartRepository repository; - @KafkaListener(topics = {"infokbart2kafka", "errorkbart2kafka"}, groupId = "logskbart", containerFactory = "kafkaLogsListenerContainerFactory") - public void listenInfoKbart2KafkaAndErrorKbart2Kafka(ConsumerRecord message) throws JsonProcessingException { - Kbart2KafkaDto dto = mapper.readValue(message.value(), Kbart2KafkaDto.class); - LogKbart entity = logsMapper.map(dto, LogKbart.class); - Timestamp timestamp = new Timestamp(message.timestamp()); - entity.setTimestamp(new Date(timestamp.getTime())); - entity.setPackageName(message.key()); - repository.save(entity); + /** + * Ecoute les topic de log d'erreurs et de fin de traitement bestPpn et génère un fichier err pour chaque fichier kbart + * @param message le message kafka + * @throws IOException exception levée + */ + @KafkaListener(topics = {"errorkbart2kafka", "bestppn.endoftraitment"}, groupId = "logskbart", containerFactory = "kafkaLogsListenerContainerFactory") + public void listenInfoKbart2KafkaAndErrorKbart2Kafka(ConsumerRecord message) throws IOException { + + if (!message.value().equals("OK")) { + Kbart2KafkaDto dto = mapper.readValue(message.value(), Kbart2KafkaDto.class); + LogKbart entity = logsMapper.map(dto, LogKbart.class); + Timestamp timestamp = new Timestamp(message.timestamp()); + entity.setTimestamp(new Date(timestamp.getTime())); + entity.setPackageName(message.key().replaceAll("\\[line\\s:\\s\\d+\\]", "")); + + // Si la ligne de log sur le topic errorkbart2kafka est de type ERROR + if (entity.getLevel().toString().equals("ERROR")) { + String nbrLine = message.key().substring(message.key().indexOf(".tsv")+4).replaceAll("\\[line\\s:\\s", "").replaceAll("]", ""); + String fileName = message.key().replaceAll(".tsv\\[line\\s:\\s\\d+\\]", ".err"); + String line = "LINE : " + nbrLine + " - MESSAGE : " + dto.getMessage(); + + // Vérifie qu'un fichier portant le nom du kbart en cours existe + Path of = Path.of(fileName); + if (Files.exists(of)) { + // Inscrit la ligne dedans + Files.write(of, (line + System.lineSeparator()).getBytes(), StandardOpenOption.APPEND); + } else if (!Files.exists(of)) { + try { + // Créer le fichier et inscrit la ligne dedans + Files.createFile(of); + Files.write(of, (line + System.lineSeparator()).getBytes(), StandardOpenOption.APPEND); + log.info("Fichier temporaire créé."); + } catch (SecurityException | IOException e) { + log.error("Erreur lors de la création du fichier temporaire. " + e); + throw new RuntimeException(e); + } + } + } + + // Inscrit l'entity en BDD + repository.save(entity); + + } else if (message.value().contains("OK")) { // Si la ligne sur le topic bestppn.endoftraitment contient OK + + // Créer un nouveau Path avec le FileName (en remplaçant l'extension par .err) + Path source = null; + for (Header header : message.headers().toArray()) { + if (header.key().equals("FileName")) { + source = Path.of(new String(header.value()).replaceAll(".tsv", ".err")); + break; + } + } + + // Copie le fichier existant vers le répertoire temporaire en ajoutant sa date de création + assert source != null; + if (Files.exists(source)) { + LocalDateTime time = LocalDateTime.now(); + DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd-HH-mm-ss", Locale.FRANCE); + String date = format.format(time); + Path target = Path.of("tempLog\\" + date + "_" + source); + + Files.move(source, target, StandardCopyOption.REPLACE_EXISTING); + log.info("Fichier de log transféré dans le dossier temporaire."); + } + } } } diff --git a/src/main/java/fr/abes/logskbart/service/KbartService.java b/src/main/java/fr/abes/logskbart/service/KbartService.java index 1b9aa56..9b97aa8 100644 --- a/src/main/java/fr/abes/logskbart/service/KbartService.java +++ b/src/main/java/fr/abes/logskbart/service/KbartService.java @@ -7,6 +7,9 @@ @Service public class KbartService { + + // TODO Supprimer cette classe + private final KbartLoaderFactory factory; private final Environment env; diff --git a/src/main/java/fr/abes/logskbart/service/KbartToTsvService.java b/src/main/java/fr/abes/logskbart/service/KbartToTsvService.java index 0ea2801..0d129a4 100644 --- a/src/main/java/fr/abes/logskbart/service/KbartToTsvService.java +++ b/src/main/java/fr/abes/logskbart/service/KbartToTsvService.java @@ -20,6 +20,9 @@ @Service public class KbartToTsvService implements KbartLoader { + + // TODO supprimer cette classe + @Value("${path.tsvFile}") private String pathToFichier;