From f0d5381b64e63c9c67d4267f725164a854b2a347 Mon Sep 17 00:00:00 2001 From: Mikhail Trofimov Date: Mon, 7 Jul 2025 16:34:45 +0300 Subject: [PATCH] Update sql for fids finding; Minor refactoring; Optimize searching for passport data --- .../config/rest/RestConfig.java | 3 ++- .../credit_tracker/facade/SignalFacade.java | 10 ++++++--- .../service/MonitoringService.java | 3 ++- .../credit_tracker/service/SignalService.java | 16 +++++++++----- .../service/UpdatingFlagsService.java | 3 ++- .../service/indic/PersonService.java | 13 ++++++------ .../mybatis/mapper/indic/PhoneMapper.xml | 21 ++++++++++--------- 7 files changed, 42 insertions(+), 27 deletions(-) diff --git a/src/main/java/ru/nbch/credit_tracker/config/rest/RestConfig.java b/src/main/java/ru/nbch/credit_tracker/config/rest/RestConfig.java index 3795342..c69bf21 100644 --- a/src/main/java/ru/nbch/credit_tracker/config/rest/RestConfig.java +++ b/src/main/java/ru/nbch/credit_tracker/config/rest/RestConfig.java @@ -2,6 +2,7 @@ package ru.nbch.credit_tracker.config.rest; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.CustomizableThreadFactory; import org.springframework.web.client.RestTemplate; import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings; @@ -21,6 +22,6 @@ public class RestConfig { @Bean(name = "executorService") public ExecutorService executorService() { - return Executors.newCachedThreadPool(); + return Executors.newCachedThreadPool(new CustomizableThreadFactory("package-registration-")); } } diff --git a/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java b/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java index 95fd81d..97e3dd6 100644 --- a/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java +++ b/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java @@ -11,6 +11,7 @@ import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings; import ru.nbch.credit_tracker.entities.dto.UserPackage; import ru.nbch.credit_tracker.entities.request.active_packages.MonitoringActivePackagesRequest; import ru.nbch.credit_tracker.entities.request.monitoring_request.MonitoringRequest; +import ru.nbch.credit_tracker.entities.request.monitoring_request.Subject; import ru.nbch.credit_tracker.entities.response.active_packages.MonitoringActivePackagesResponse; import ru.nbch.credit_tracker.entities.response.active_packages.Package; import ru.nbch.credit_tracker.entities.response.active_packages.Packages; @@ -142,6 +143,7 @@ public class SignalFacade { } packageId = signalService.registerPackage(monitoringRequest); + log.info("Package registered. PackageId {}. Status: {}", packageId, Status.PROCESSING.name()); } catch (Exception e) { if (e instanceof SignalClientException) { throw (SignalClientException) e; @@ -150,15 +152,16 @@ public class SignalFacade { throw serverExcp(SignalError.ERROR_100, XmlErrorFormat.MonitoringError); } - // в отдельном потоке запускаем поиск фидов и расчет флагов просрочек - registerFidsAndDebts(packageId, monitoringRequest.getPackageName()); + // в отдельном потоке запускаем регистрацию субъектов, поиск фидов и расчет флагов просрочек + registerFidsAndDebts(packageId, monitoringRequest.getPackageName(), monitoringRequest.getSubjects().getSubject()); return ResponseEntity.ok().body(new MonitoringResponse()); } - private void registerFidsAndDebts(Integer packageId, String packageName) { + private void registerFidsAndDebts(Integer packageId, String packageName, List subjects) { executor.execute(() -> { try { + signalService.registerSubjects(subjects, packageId); List phoneFidsData = signalService.registerSubjectsFidAndDebts(packageId); if (!phoneFidsData.isEmpty()) { Signals signals = signalService.buildSignals(packageId, phoneFidsData); @@ -174,6 +177,7 @@ public class SignalFacade { } catch (Exception e) { signalService.updatePackageStatus(packageId, Status.ERROR); log.error("Ошибка при поиске фидов или расчете флагов просрочек. Package_id {}", packageId, e); + // TODO очистить таблицу signals_phone_fid_map ? } }); } 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 f82e8c7..39ff8eb 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/MonitoringService.java +++ b/src/main/java/ru/nbch/credit_tracker/service/MonitoringService.java @@ -1,6 +1,7 @@ package ru.nbch.credit_tracker.service; import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.concurrent.CustomizableThreadFactory; import org.springframework.stereotype.Service; import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings; import ru.nbch.credit_tracker.entities.dto.Hit; @@ -50,7 +51,7 @@ public class MonitoringService { } public void run() { - ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); + ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(new CustomizableThreadFactory("monitoring-")); long period = config.getMonitoringInterval() != null ? config.getMonitoringInterval() : 15; scheduler.scheduleAtFixedRate(this::monitor, 0, period, TimeUnit.MINUTES); } diff --git a/src/main/java/ru/nbch/credit_tracker/service/SignalService.java b/src/main/java/ru/nbch/credit_tracker/service/SignalService.java index a4866f6..595c662 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/SignalService.java +++ b/src/main/java/ru/nbch/credit_tracker/service/SignalService.java @@ -67,13 +67,17 @@ public class SignalService { .createdAt(LocalDateTime.now()) .status(Status.PROCESSING.name()) .build(); - Integer packageId = userPackageService.insertPackage(userPackage); - List subjects = request.getSubjects().getSubject(); + return userPackageService.insertPackage(userPackage); + } + + public void registerSubjects(List subjects, Integer packageId) { + log.info("Start registering subjects. PackageId: {}", packageId); for (int i = 0; i < subjects.size(); i += batchSize) { int end = Math.min(i + batchSize, subjects.size()); - phoneFidMapService.registerSubjects(subjects.subList(i, end), packageId); // TODO преобразовывать список в List ? + phoneFidMapService.registerSubjects(subjects.subList(i, end), packageId); + log.trace("Registered subject's batch from: {} to: {}. Total count: {}. PackageId: {}", i, end, subjects.size(), packageId); } - return packageId; + log.info("Subjects were registered. PackageId: {}", packageId); } public List registerSubjectsFidAndDebts(Integer packageId) { @@ -82,6 +86,7 @@ public class SignalService { } public List updateFlags(List subjects, Integer packageId) { + log.info("Start calculating fids and flags for subjects. PackageId: {}", packageId); List fidsPhoneDataList = phoneService.findFidsPhoneData(subjects); LocalDateTime calculatedAt = LocalDateTime.now(); for (int i = 0; i < fidsPhoneDataList.size(); i += batchSize) { @@ -120,9 +125,10 @@ public class SignalService { for (int j = 0; j < subjectToUpdate.size(); j += updateBatchSize) { int endIndex = Math.min(j + updateBatchSize, subjectToUpdate.size()); phoneFidMapService.updatePhoneFidMaps(subjectToUpdate.subList(j, endIndex)); + log.trace("Updated fids and flags for subject's batch from: {} to: {}. Total count: {}. PackageId: {}", i, end, subjectToUpdate.size(), packageId); } } - + log.info("Finish calculating fids and flags for subjects. PackageId: {}", packageId); return fidsPhoneDataList; } diff --git a/src/main/java/ru/nbch/credit_tracker/service/UpdatingFlagsService.java b/src/main/java/ru/nbch/credit_tracker/service/UpdatingFlagsService.java index ad2b150..8539cbf 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/UpdatingFlagsService.java +++ b/src/main/java/ru/nbch/credit_tracker/service/UpdatingFlagsService.java @@ -1,6 +1,7 @@ package ru.nbch.credit_tracker.service; import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.concurrent.CustomizableThreadFactory; import org.springframework.stereotype.Service; import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings; import ru.nbch.credit_tracker.entities.dto.PhoneFidMap; @@ -36,7 +37,7 @@ public class UpdatingFlagsService { } public void run() { - ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); + ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(new CustomizableThreadFactory("updating-flags-")); scheduler.scheduleAtFixedRate(this::update, 0, updateFlagsInterval, TimeUnit.DAYS); } diff --git a/src/main/java/ru/nbch/credit_tracker/service/indic/PersonService.java b/src/main/java/ru/nbch/credit_tracker/service/indic/PersonService.java index 606a830..826fa16 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/indic/PersonService.java +++ b/src/main/java/ru/nbch/credit_tracker/service/indic/PersonService.java @@ -70,20 +70,21 @@ public class PersonService { } private Map findPassportData(List fids) { - Map passportDataMap = new HashMap<>(); + Map resultMap = new HashMap<>(); List passports = mapper.findPassportData(fids); + Map> passportsMap = passports.stream() + .collect(Collectors.groupingBy(PassportData::getFid)); + fids.forEach(fid -> { - PassportData passport = findPassport(passports.stream() - .filter(passportData -> passportData.getFid().equals(fid)) - .collect(Collectors.toList())); + PassportData passport = findPassport(passportsMap.get(fid)); if (passport != null) { - passportDataMap.put(fid, passport); + resultMap.put(fid, passport); } }); - return passportDataMap; + return resultMap; } private PassportData findPassport(List passports) { diff --git a/src/main/resources/mybatis/mapper/indic/PhoneMapper.xml b/src/main/resources/mybatis/mapper/indic/PhoneMapper.xml index 7dd9e60..e37f91a 100644 --- a/src/main/resources/mybatis/mapper/indic/PhoneMapper.xml +++ b/src/main/resources/mybatis/mapper/indic/PhoneMapper.xml @@ -6,18 +6,19 @@ - - - + + + \ No newline at end of file