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

This commit is contained in:
Mikhail Trofimov 2025-09-10 14:45:21 +03:00
parent d0c20abb96
commit 1aff345768
3 changed files with 46 additions and 31 deletions

View file

@ -1,5 +1,5 @@
#commons #commons
APP_VERSION=1.7 APP_VERSION=1.8
REGISTRY_URL=rh8-vm3.nbki.msk:5000 REGISTRY_URL=rh8-vm3.nbki.msk:5000
JMX_PORT= JMX_PORT=
JMX_HOSTNAME= JMX_HOSTNAME=

View file

@ -10,7 +10,7 @@
</parent> </parent>
<groupId>ru.nbch</groupId> <groupId>ru.nbch</groupId>
<artifactId>credit-tracker</artifactId> <artifactId>credit-tracker</artifactId>
<version>1.7</version> <version>1.8</version>
<name>credit_tracker</name> <name>credit_tracker</name>
<description>Credit Tracker Application</description> <description>Credit Tracker Application</description>

View file

@ -26,7 +26,10 @@ import java.io.*;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.time.LocalDateTime; 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.Executors;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -86,45 +89,54 @@ public class MonitoringService {
continue; continue;
} }
// Находим самый последний отчет по дате
Optional<String> newReport = Optional.of(fileNames)
.orElseGet(Collections::emptyList)
.stream().max(Comparator.comparing(CTUtil::parseDateFromReportFileName)); // отфильтровали только те имена, которые парсятся в дату, так что null тут не придет
LocalDateTime lastDownloadedReportDate = CTUtil.parseDateFromReportFileName(userPackage.getLastDownloadedReport()); 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())) { if (StringUtils.isNotBlank(userPackage.getLastDownloadedReport())) {
log.info("Last downloaded report found for package {}. Last Downloaded Report Name: {}", userPackage.getPackageName(), userPackage.getLastDownloadedReport()); log.info("Last downloaded report found for package {}. Last Downloaded Report Name: {}", userPackage.getPackageName(), userPackage.getLastDownloadedReport());
} else { } else {
log.info("Last Downloaded Report Name is empty"); log.info("Last Downloaded Report Name is empty");
} }
try { for (String newReport : fileNames) {
String reportPath = null; try {
if (StringUtils.isBlank(userPackage.getLastDownloadedReport()) && newReport.isPresent()) { String reportPath = null;
reportPath = loadReport(userPackage.getId(), newReport.get()); // по этому пакету еще не было загруженных отчетов, продолжаем работу с полученным if (StringUtils.isBlank(userPackage.getLastDownloadedReport())) {
} else if (lastDownloadedReportDate != null && newReport.isPresent()) { reportPath = loadReport(userPackage.getId(), newReport); // по этому пакету еще не было загруженных отчетов, продолжаем работу с полученным
LocalDateTime newReportDate = CTUtil.parseDateFromReportFileName(newReport.get()); } else if (lastDownloadedReportDate != null) {
if (newReportDate.isAfter(lastDownloadedReportDate)) { LocalDateTime newReportDate = CTUtil.parseDateFromReportFileName(newReport);
reportPath = loadReport(userPackage.getId(), newReport.get()); // полученный отчет новее записанного в базу 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 responsePath = generateResponse(userPackage, reportPath);
String fileName = createResponseFile(userPackage, responsePath); String fileName = createResponseFile(userPackage, responsePath);
if (fileName != null) { if (fileName != null) {
log.info("New report fileName: {}", fileName); log.info("New report fileName: {}", fileName);
updateSignalHits(userPackage, responsePath, fileName); updateSignalHits(userPackage, responsePath, fileName);
signalService.updateLastDownloadedReport(userPackage.getId(), newReport.get()); signalService.updateLastDownloadedReport(userPackage.getId(), newReport);
} else { } else {
log.info("Report was not created for package {}", userPackage.getPackageName()); 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"); log.info("Finish monitoring");
@ -210,6 +222,7 @@ public class MonitoringService {
private String createResponseFile(UserPackage userPackage, String responsePath) { private String createResponseFile(UserPackage userPackage, String responsePath) {
try { try {
String fileName = CTUtil.generateResponseReportFileName(userPackage.getUserId(), userPackage.getPackageName()); 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; String filePath = config.getLoadDir() + File.separator + userPackage.getUserId().substring(0, 6) + File.separator;
File folder = new File(filePath); File folder = new File(filePath);
@ -232,6 +245,8 @@ public class MonitoringService {
zos.closeEntry(); zos.closeEntry();
} }
return fileName; return fileName;
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} catch (Exception e) { } catch (Exception e) {
log.error("Ошибка при записи отчета пользователя в файл: ", e); log.error("Ошибка при записи отчета пользователя в файл: ", e);
} }