etreschenkov 2026-01-14 19:07:23 +03:00
parent 35bc835a0d
commit 5c1d9ccd2a
7 changed files with 39 additions and 24 deletions

View file

@ -13,6 +13,8 @@ public class CreditTrackerApplication {
ConfigurableApplicationContext ctx = SpringApplication.run(CreditTrackerApplication.class, args); ConfigurableApplicationContext ctx = SpringApplication.run(CreditTrackerApplication.class, args);
UpdateProcessingPackagesService updateProcessingPackagesService = ctx.getBean(UpdateProcessingPackagesService.class); UpdateProcessingPackagesService updateProcessingPackagesService = ctx.getBean(UpdateProcessingPackagesService.class);
MonitoringService monitoringService = ctx.getBean(MonitoringService.class); MonitoringService monitoringService = ctx.getBean(MonitoringService.class);
// UpdatingFlagsService updatingFlagsService = ctx.getBean(UpdatingFlagsService.class);
// updatingFlagsService.update();
updateProcessingPackagesService.run(); updateProcessingPackagesService.run();
monitoringService.run(); monitoringService.run();
} }

View file

@ -5,6 +5,7 @@ import java.util.function.Supplier;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings; import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
import ru.nbch.credit_tracker.mapper.signal.PhonesMapMapper;
import ru.nbch.credit_tracker.mapper.signal.UserPackageMapper; import ru.nbch.credit_tracker.mapper.signal.UserPackageMapper;
import ru.nbch.credit_tracker.model.impl.EmptyTerminatePayload; import ru.nbch.credit_tracker.model.impl.EmptyTerminatePayload;
import ru.nbch.credit_tracker.model.impl.PartFilePayload; import ru.nbch.credit_tracker.model.impl.PartFilePayload;
@ -15,6 +16,7 @@ import ru.nbch.credit_tracker.service.signal.PackageRecordsService;
import ru.nbch.credit_tracker.service.task.SetupParam; import ru.nbch.credit_tracker.service.task.SetupParam;
import ru.nbch.credit_tracker.service.task.impl.KickPipeLineDefaultImpl; import ru.nbch.credit_tracker.service.task.impl.KickPipeLineDefaultImpl;
import ru.nbch.credit_tracker.service.task.impl.KickPipeLineRepeatedRestoreImpl; import ru.nbch.credit_tracker.service.task.impl.KickPipeLineRepeatedRestoreImpl;
import ru.nbch.credit_tracker.service.task.impl.KickRecalcPipeLine;
import ru.nbch.credit_tracker.service.task.impl.NoOpTerminator; import ru.nbch.credit_tracker.service.task.impl.NoOpTerminator;
import ru.nbch.credit_tracker.service.task.impl.XmlMergeCoordinator; import ru.nbch.credit_tracker.service.task.impl.XmlMergeCoordinator;
import ru.nbch.credit_tracker.service.task.setup.IPipeLineStarter; import ru.nbch.credit_tracker.service.task.setup.IPipeLineStarter;
@ -25,7 +27,8 @@ public class PipelineStarterConfig {
@Bean @Bean
public Function<SetupParam, IPipeLineStarter<SubjectPayload>> pipelineStarterFactory(CreditTrackerSettings creditTrackerSettings, public Function<SetupParam, IPipeLineStarter<SubjectPayload>> pipelineStarterFactory(CreditTrackerSettings creditTrackerSettings,
UserPackageMapper userPackageMapper, UserPackageMapper userPackageMapper,
PackageRecordsService packageRecordsService) { PackageRecordsService packageRecordsService,
PhonesMapMapper phonesMapMapper) {
return (setupParam) -> switch (setupParam.mode()) { return (setupParam) -> switch (setupParam.mode()) {
case DEFAULT -> case DEFAULT ->
new KickPipeLineDefaultImpl(setupParam, userPackageMapper, packageRecordsService, creditTrackerSettings); new KickPipeLineDefaultImpl(setupParam, userPackageMapper, packageRecordsService, creditTrackerSettings);
@ -33,7 +36,8 @@ public class PipelineStarterConfig {
new KickPipeLineDefaultImpl(setupParam, userPackageMapper, packageRecordsService, creditTrackerSettings); new KickPipeLineDefaultImpl(setupParam, userPackageMapper, packageRecordsService, creditTrackerSettings);
case REPEATED_RESTORE -> case REPEATED_RESTORE ->
new KickPipeLineRepeatedRestoreImpl(setupParam, userPackageMapper, packageRecordsService, creditTrackerSettings); new KickPipeLineRepeatedRestoreImpl(setupParam, userPackageMapper, packageRecordsService, creditTrackerSettings);
case RECALC_PERSONAL_DATA -> null; case RECALC_PERSONAL_DATA ->
new KickRecalcPipeLine(setupParam, userPackageMapper, phonesMapMapper, packageRecordsService, creditTrackerSettings);
}; };
} }

View file

@ -70,7 +70,7 @@ public class UpdatingFlagsService {
} }
// @Scheduled(cron = "${ct.update-flags-cron-expression}") // @Scheduled(cron = "${ct.update-flags-cron-expression}")
private void update() { public void update() {
log.info("Start updating flags"); log.info("Start updating flags");
try { try {
Pipeline pipeline = pipelinePackageManager.buildRecalculationPD(new SetupParam(null, null, PipelineMode.RECALC_PERSONAL_DATA)); Pipeline pipeline = pipelinePackageManager.buildRecalculationPD(new SetupParam(null, null, PipelineMode.RECALC_PERSONAL_DATA));

View file

@ -62,7 +62,7 @@ public class FidIdUpdater implements Handler<SubjectPayload, VoidPayload> {
}) })
.toList(); .toList();
packageRecordsService.updateIdCache(idCacheOnUpdate); packageRecordsService.updateIdCache(personOnProcessing);
log.debug("personOnProcessing size: {}", personOnProcessing.size()); log.debug("personOnProcessing size: {}", personOnProcessing.size());
return new VoidPayload(); return new VoidPayload();

View file

@ -43,7 +43,7 @@ public class FidNameUpdater implements Handler<SubjectPayload, SubjectPayload> {
Name name = nameByPhone.get(CTUtil.normalizePhoneNumber(subjectProfile.getPhone().toString())); Name name = nameByPhone.get(CTUtil.normalizePhoneNumber(subjectProfile.getPhone().toString()));
if (name == null) { if (name == null) {
notFoundFidPhones.add(subjectProfile.getPhone()); notFoundFidPhones.add(subjectProfile.getPhone());
} else if (subjectProfile.getFid().equals(name.getFid())) { } else if (!subjectProfile.getFid().equals(name.getFid())) {
changingFidPhones.add(subjectProfile); changingFidPhones.add(subjectProfile);
} }
}); });

View file

@ -2,16 +2,16 @@ package ru.nbch.credit_tracker.service.task.impl;
import java.util.List; import java.util.List;
import java.util.concurrent.BlockingQueue; import java.util.concurrent.BlockingQueue;
import java.util.concurrent.atomic.AtomicInteger;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings; import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
import ru.nbch.credit_tracker.entities.app.PhonesMap; import ru.nbch.credit_tracker.entities.app.PhonesMap;
import ru.nbch.credit_tracker.entities.app.UserPackage;
import ru.nbch.credit_tracker.enums.PoisonType; import ru.nbch.credit_tracker.enums.PoisonType;
import ru.nbch.credit_tracker.exceptions.SignalClientException; import ru.nbch.credit_tracker.exceptions.SignalClientException;
import ru.nbch.credit_tracker.mapper.signal.PhonesMapMapper; import ru.nbch.credit_tracker.mapper.signal.PhonesMapMapper;
import ru.nbch.credit_tracker.mapper.signal.UserPackageMapper; import ru.nbch.credit_tracker.mapper.signal.UserPackageMapper;
import ru.nbch.credit_tracker.model.IdData;
import ru.nbch.credit_tracker.model.NameData;
import ru.nbch.credit_tracker.model.PipelineContext; import ru.nbch.credit_tracker.model.PipelineContext;
import ru.nbch.credit_tracker.model.SubjectProfile; import ru.nbch.credit_tracker.model.SubjectProfile;
import ru.nbch.credit_tracker.model.impl.PackageVariable; import ru.nbch.credit_tracker.model.impl.PackageVariable;
@ -21,7 +21,7 @@ import ru.nbch.credit_tracker.service.task.SetupParam;
import ru.nbch.credit_tracker.service.task.setup.IPipeLineStarter; import ru.nbch.credit_tracker.service.task.setup.IPipeLineStarter;
import ru.nbch.credit_tracker.utils.error.ExceptionUtils; import ru.nbch.credit_tracker.utils.error.ExceptionUtils;
public abstract class KickRecalcPipeLine implements IPipeLineStarter<SubjectPayload> { public class KickRecalcPipeLine implements IPipeLineStarter<SubjectPayload> {
private final Logger log = LoggerFactory.getLogger(getClass()); private final Logger log = LoggerFactory.getLogger(getClass());
protected final Long packageId; protected final Long packageId;
protected final UserPackageMapper userPackageMapper; protected final UserPackageMapper userPackageMapper;
@ -31,7 +31,6 @@ public abstract class KickRecalcPipeLine implements IPipeLineStarter<SubjectPayl
private final int BATCH_SIZE; private final int BATCH_SIZE;
private final Long daysToUpdateFlags; private final Long daysToUpdateFlags;
private boolean isInterrupted = false; private boolean isInterrupted = false;
protected int offset = 0;
private PipelineContext<PackageVariable> context; private PipelineContext<PackageVariable> context;
@ -64,21 +63,28 @@ public abstract class KickRecalcPipeLine implements IPipeLineStarter<SubjectPayl
@Override @Override
public void startFillingQueue(BlockingQueue<SubjectPayload> firstQueue) { public void startFillingQueue(BlockingQueue<SubjectPayload> firstQueue) {
try { try {
log.info("Start kicker: mode:{}, packageId: {};", mode(), packageId); log.info("Start kicker: mode:{};", mode());
context.store(PackageVariable.packageId, packageId); int offset = 0;
context.store(PackageVariable.cacheMisses, new AtomicInteger()); List<PhonesMap> page = nextPage(offset);
context.store(PackageVariable.cacheHits, new AtomicInteger());
int limit = BATCH_SIZE;
UserPackage userPackage = userPackageMapper.findPackage(packageId);
List<PhonesMap> page = nextPage(limit);
while (!page.isEmpty()) { while (!page.isEmpty()) {
log.debug("Get page {}", page.size()); log.debug("Get page {}", page.size());
List<SubjectProfile> subjectProfiles = page.stream().map(phoneFidMap -> SubjectProfile.builder() List<SubjectProfile> subjectProfiles = page.stream().map(phoneFidMap -> SubjectProfile.builder()
.mapId(phoneFidMap.getId()) .mapId(phoneFidMap.getId())
.phone(phoneFidMap.getPhone()) .phone(phoneFidMap.getPhone())
.fid(phoneFidMap.getFid())
.nameData(NameData.builder()
.middleName(phoneFidMap.getMiddle())
.firstName(phoneFidMap.getFirst())
.lastName(phoneFidMap.getName1())
.birthDate(phoneFidMap.getBirthDt())
.build())
.idData(IdData.builder()
.idNum(phoneFidMap.getSerNum())
.idType(phoneFidMap.getIdType())
.build())
.build()).toList(); .build()).toList();
try { try {
SubjectPayload payload = new SubjectPayload(packageId, userPackage.getUserId(), userPackage.getPackageName(), subjectProfiles); SubjectPayload payload = new SubjectPayload(null, null, null, subjectProfiles);
payload.setContext(context); payload.setContext(context);
firstQueue.put(payload); firstQueue.put(payload);
} catch (InterruptedException e) { } catch (InterruptedException e) {
@ -86,8 +92,8 @@ public abstract class KickRecalcPipeLine implements IPipeLineStarter<SubjectPayl
log.error("Pipeline starter was interrupted!"); log.error("Pipeline starter was interrupted!");
throw new PipelineStarterException(); throw new PipelineStarterException();
} }
offset += limit; offset += BATCH_SIZE;
page = nextPage(limit); page = nextPage(offset);
} }
} catch (PipelineStarterException e) { } catch (PipelineStarterException e) {
log.info("Pipeline starter shutting down..."); log.info("Pipeline starter shutting down...");
@ -109,7 +115,7 @@ public abstract class KickRecalcPipeLine implements IPipeLineStarter<SubjectPayl
protected PipelineMode mode() { protected PipelineMode mode() {
return PipelineMode.REPEATED_RESTORE; return PipelineMode.REPEATED_RESTORE;
} }
protected List<PhonesMap> nextPage(Integer limit) { protected List<PhonesMap> nextPage(int offset) {
return phonesMapMapper.searchedAtLessThan(daysToUpdateFlags.intValue(), limit, BATCH_SIZE); return phonesMapMapper.searchedAtLessThan(daysToUpdateFlags.intValue(), BATCH_SIZE, offset);
} }
} }

View file

@ -6,6 +6,7 @@
<mapper namespace="ru.nbch.credit_tracker.mapper.signal.PhonesMapMapper"> <mapper namespace="ru.nbch.credit_tracker.mapper.signal.PhonesMapMapper">
<resultMap id="PhoneMap" type="ru.nbch.credit_tracker.entities.app.PhonesMap"> <resultMap id="PhoneMap" type="ru.nbch.credit_tracker.entities.app.PhonesMap">
<result property="id" column="id"/>
<result property="fid" column="fid"/> <result property="fid" column="fid"/>
<result property="phone" column="phone"/> <result property="phone" column="phone"/>
<result property="name1" column="name_1"/> <result property="name1" column="name_1"/>
@ -21,7 +22,8 @@
</resultMap> </resultMap>
<select id="findByPhone" resultMap="PhoneMap"> <select id="findByPhone" resultMap="PhoneMap">
select fid, select id,
fid,
phone, phone,
name_1, name_1,
first, first,
@ -38,7 +40,8 @@
</select> </select>
<select id="searchedAtLessThan" resultMap="PhoneMap"> <select id="searchedAtLessThan" resultMap="PhoneMap">
select fid, select id,
fid,
phone, phone,
name_1, name_1,
first, first,
@ -51,7 +54,7 @@
searched_at, searched_at,
calculated_at calculated_at
FROM signals_phones_map FROM signals_phones_map
WHERE searched_at &gt; now() - make_interval(days => #{daysCount}) WHERE searched_at &lt; now() - make_interval(days => #{daysCount})
ORDER BY id ORDER BY id
LIMIT #{limit} OFFSET #{offset} LIMIT #{limit} OFFSET #{offset}
</select> </select>