From 1aff34576806aa9475ff02018669e175ba854709 Mon Sep 17 00:00:00 2001 From: Mikhail Trofimov Date: Wed, 10 Sep 2025 14:45:21 +0300 Subject: [PATCH] http://jira.mfd.msk:8088/browse/BKI-3200 Fix MonitoringService to load all reports after last report (Not only latest); Updated version to 1.8 --- docker_compose/credit_tracker_config.env | 2 +- pom.xml | 2 +- .../service/MonitoringService.java | 73 +++++++++++-------- 3 files changed, 46 insertions(+), 31 deletions(-) diff --git a/docker_compose/credit_tracker_config.env b/docker_compose/credit_tracker_config.env index b553e30..d684e15 100644 --- a/docker_compose/credit_tracker_config.env +++ b/docker_compose/credit_tracker_config.env @@ -1,5 +1,5 @@ #commons -APP_VERSION=1.7 +APP_VERSION=1.8 REGISTRY_URL=rh8-vm3.nbki.msk:5000 JMX_PORT= JMX_HOSTNAME= diff --git a/pom.xml b/pom.xml index 98d1fe5..5d022df 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ ru.nbch credit-tracker - 1.7 + 1.8 credit_tracker Credit Tracker Application diff --git a/src/main/java/ru/nbch/credit_tracker/service/MonitoringService.java b/src/main/java/ru/nbch/credit_tracker/service/MonitoringService.java index 763f4b2..13e649d 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/MonitoringService.java +++ b/src/main/java/ru/nbch/credit_tracker/service/MonitoringService.java @@ -26,7 +26,10 @@ import java.io.*; import java.nio.file.Files; import java.nio.file.Path; import java.time.LocalDateTime; -import java.util.*; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.UUID; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -86,45 +89,54 @@ public class MonitoringService { continue; } - // Находим самый последний отчет по дате - Optional newReport = Optional.of(fileNames) - .orElseGet(Collections::emptyList) - .stream().max(Comparator.comparing(CTUtil::parseDateFromReportFileName)); // отфильтровали только те имена, которые парсятся в дату, так что null тут не придет - LocalDateTime lastDownloadedReportDate = CTUtil.parseDateFromReportFileName(userPackage.getLastDownloadedReport()); + if (lastDownloadedReportDate != null) { + // Отбираем только те отчеты, дата которых позже даты последнего загруженного отчета + fileNames = fileNames.stream() + .filter(fileName -> CTUtil.parseDateFromReportFileName(fileName).isAfter(lastDownloadedReportDate)) // отфильтровали только те имена, которые парсятся в дату, так что null тут не придет + .sorted(Comparator.comparing(CTUtil::parseDateFromReportFileName)) // Сортируем по дате + .toList(); + } else { + fileNames = fileNames.stream() + .sorted(Comparator.comparing(CTUtil::parseDateFromReportFileName)) // Сортируем по дате + .toList(); + } + if (StringUtils.isNotBlank(userPackage.getLastDownloadedReport())) { log.info("Last downloaded report found for package {}. Last Downloaded Report Name: {}", userPackage.getPackageName(), userPackage.getLastDownloadedReport()); } else { log.info("Last Downloaded Report Name is empty"); } - try { - String reportPath = null; - if (StringUtils.isBlank(userPackage.getLastDownloadedReport()) && newReport.isPresent()) { - reportPath = loadReport(userPackage.getId(), newReport.get()); // по этому пакету еще не было загруженных отчетов, продолжаем работу с полученным - } else if (lastDownloadedReportDate != null && newReport.isPresent()) { - LocalDateTime newReportDate = CTUtil.parseDateFromReportFileName(newReport.get()); - if (newReportDate.isAfter(lastDownloadedReportDate)) { - reportPath = loadReport(userPackage.getId(), newReport.get()); // полученный отчет новее записанного в базу + for (String newReport : fileNames) { + try { + String reportPath = null; + if (StringUtils.isBlank(userPackage.getLastDownloadedReport())) { + reportPath = loadReport(userPackage.getId(), newReport); // по этому пакету еще не было загруженных отчетов, продолжаем работу с полученным + } else if (lastDownloadedReportDate != null) { + LocalDateTime newReportDate = CTUtil.parseDateFromReportFileName(newReport); + if (newReportDate.isAfter(lastDownloadedReportDate)) { + reportPath = loadReport(userPackage.getId(), newReport); // полученный отчет новее записанного в базу + } + } + if (reportPath == null) { + log.info("Report was not loaded for package {}", userPackage.getPackageName()); + continue; } - } - if (reportPath == null) { - log.info("Report was not loaded for package {}", userPackage.getPackageName()); - continue; - } - String responsePath = generateResponse(userPackage, reportPath); - String fileName = createResponseFile(userPackage, responsePath); - if (fileName != null) { - log.info("New report fileName: {}", fileName); - updateSignalHits(userPackage, responsePath, fileName); - signalService.updateLastDownloadedReport(userPackage.getId(), newReport.get()); - } else { - log.info("Report was not created for package {}", userPackage.getPackageName()); + String responsePath = generateResponse(userPackage, reportPath); + String fileName = createResponseFile(userPackage, responsePath); + if (fileName != null) { + log.info("New report fileName: {}", fileName); + updateSignalHits(userPackage, responsePath, fileName); + signalService.updateLastDownloadedReport(userPackage.getId(), newReport); + } else { + log.info("Report was not created for package {}", userPackage.getPackageName()); + } + } catch (Exception e) { + log.error(e.getMessage(), e); } - } catch (Exception e) { - log.error(e.getMessage(), e); } } log.info("Finish monitoring"); @@ -210,6 +222,7 @@ public class MonitoringService { private String createResponseFile(UserPackage userPackage, String responsePath) { try { String fileName = CTUtil.generateResponseReportFileName(userPackage.getUserId(), userPackage.getPackageName()); + Thread.sleep(1000); // Если отчеты формируются слишком быстро, нужно подождать секунду, тк в имени отчета LocalDateTime до секунд String filePath = config.getLoadDir() + File.separator + userPackage.getUserId().substring(0, 6) + File.separator; File folder = new File(filePath); @@ -232,6 +245,8 @@ public class MonitoringService { zos.closeEntry(); } return fileName; + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); } catch (Exception e) { log.error("Ошибка при записи отчета пользователя в файл: ", e); }