NP: get rid of unused kick pipelines;

LP: added lp kick pipelines with data loading
This commit is contained in:
Mikhail Trofimov 2026-07-02 17:09:39 +03:00
parent 012d7085ad
commit bc78b389e7
18 changed files with 349 additions and 130 deletions

View file

@ -3,6 +3,7 @@ package ru.nbch.credit_tracker.config.task;
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.LegalsMapMapper;
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.impl.EmptyTerminatePayload; import ru.nbch.credit_tracker.model.impl.EmptyTerminatePayload;
@ -25,15 +26,24 @@ public class PipelineStarterConfig {
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) { PhonesMapMapper phonesMapMapper,
// TODO separate for subject type LegalsMapMapper legalsMapMapper) {
return (setupParam) -> switch (setupParam.mode()) { return (setupParam) -> {
case DEFAULT, RESEND, RESTORE -> if (setupParam.subjectType() == 1) {
new KickPipeLineDefaultImpl(setupParam, userPackageMapper, packageRecordsService, creditTrackerSettings); return switch (setupParam.mode()) {
case REPEATED_RESTORE, MAKE_XML_BY_REPEATED -> case DEFAULT, RESEND ->
new KickPipeLineRepeatedRestoreImpl(setupParam, userPackageMapper, packageRecordsService, creditTrackerSettings); new NpKickPipeLineDefaultImpl(setupParam, userPackageMapper, packageRecordsService, creditTrackerSettings);
case RECALC_PERSONAL_DATA -> case RECALC_FID ->
new KickRecalcPipeLine(setupParam, userPackageMapper, phonesMapMapper, packageRecordsService, creditTrackerSettings); new NpKickRecalcPipeLine(setupParam, userPackageMapper, phonesMapMapper, packageRecordsService, creditTrackerSettings);
};
} else {
return switch (setupParam.mode()) {
case DEFAULT, RESEND ->
new LpKickPipelineDefaultImpl(setupParam, userPackageMapper, packageRecordsService, creditTrackerSettings);
case RECALC_FID ->
new LpKickRecalcPipeLine(setupParam, userPackageMapper, legalsMapMapper, packageRecordsService, creditTrackerSettings);
};
}
}; };
} }

View file

@ -2,6 +2,7 @@ package ru.nbch.credit_tracker.mapper.signal;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import ru.nbch.credit_tracker.entities.app.SignalLegalFidMap;
import java.util.List; import java.util.List;
@ -10,4 +11,7 @@ public interface LegalsFidMapMapper {
List<Long> registerJson(@Param("json") String json); List<Long> registerJson(@Param("json") String json);
List<SignalLegalFidMap> findFullLegalFidMap(@Param("packageId") Long packageId,
@Param("limit") int limit,
@Param("offset") int offset);
} }

View file

@ -22,5 +22,9 @@ public interface LegalsMapMapper {
List<LegalsMap> findEligibleForFlagsInsert(@Param("lastId") Long lastId, List<LegalsMap> findEligibleForFlagsInsert(@Param("lastId") Long lastId,
@Param("batchSize") Integer batchSize); @Param("batchSize") Integer batchSize);
List<LegalsMap> searchedAtLessThan(@Param("daysCount") Integer daysCount,
@Param("batchSize") int batchSize,
@Param("lastId") Long lastId);
List<LegalsMap> findCachedByInnAndRegNUm(@Param("json") String json); List<LegalsMap> findCachedByInnAndRegNUm(@Param("json") String json);
} }

View file

@ -64,7 +64,7 @@ public class StartupRestoreService {
log.trace("Deleted {} rows", count); log.trace("Deleted {} rows", count);
Path xmlReqPath = CTUtil.workingPathToReqByPackage(creditTrackerSettings.getLoadDir(), userPackage); Path xmlReqPath = CTUtil.workingPathToReqByPackage(creditTrackerSettings.getLoadDir(), userPackage);
log.debug("Try to read and build pipeline for packageId {}; req xml path: {}", userPackage.getId(), xmlReqPath); log.debug("Try to read and build pipeline for packageId {}; req xml path: {}", userPackage.getId(), xmlReqPath);
Pipeline pipeline = npPipelinePackageManager.build(new SetupParam(userPackage.getId(), xmlReqPath, PipelineMode.DEFAULT)); Pipeline pipeline = npPipelinePackageManager.build(new SetupParam(userPackage.getId(), 1, PipelineMode.DEFAULT));
pipelineOrchestrator.startOrDelay( pipelineOrchestrator.startOrDelay(
() -> saver.readAndSaveNpPackage(userPackage.getId(), xmlReqPath), () -> saver.readAndSaveNpPackage(userPackage.getId(), xmlReqPath),
pipeline, userPackage.getId() pipeline, userPackage.getId()
@ -81,7 +81,7 @@ public class StartupRestoreService {
for (UserPackage userPackage : packages) { for (UserPackage userPackage : packages) {
try { try {
log.debug("Build pipeline for packageId {}", userPackage.getId()); log.debug("Build pipeline for packageId {}", userPackage.getId());
Pipeline pipeline = npPipelinePackageManager.build(new SetupParam(userPackage.getId(), null, PipelineMode.DEFAULT)); Pipeline pipeline = npPipelinePackageManager.build(new SetupParam(userPackage.getId(), 1, PipelineMode.DEFAULT));
pipelineOrchestrator.startOrDelay(pipeline, userPackage.getId()); pipelineOrchestrator.startOrDelay(pipeline, userPackage.getId());
} catch (Exception e) { } catch (Exception e) {
log.error("Error build restore pipeline for packageId {}: {}", userPackage.getId(), ExceptionUtils.getStackTrace(e)); log.error("Error build restore pipeline for packageId {}: {}", userPackage.getId(), ExceptionUtils.getStackTrace(e));

View file

@ -51,7 +51,7 @@ public class UpdatingFidService {
phonesMapService.deleteUnusedPhones(); phonesMapService.deleteUnusedPhones();
log.info("Start updating fids and PD"); log.info("Start updating fids and PD");
try { try {
Pipeline pipeline = npPipelinePackageFabric.buildRecalculationPD(new SetupParam(null, null, PipelineMode.RECALC_PERSONAL_DATA)); Pipeline pipeline = npPipelinePackageFabric.buildRecalculationPD(new SetupParam(null, 1, PipelineMode.RECALC_FID));
CompletableFuture<?> future = pipelineRecalcPDOrchestrator.startOrReject(pipeline); CompletableFuture<?> future = pipelineRecalcPDOrchestrator.startOrReject(pipeline);
future.whenComplete((o, throwable) -> { future.whenComplete((o, throwable) -> {
try { try {
@ -63,7 +63,7 @@ public class UpdatingFidService {
List<UserPackage> packagesRepeated = userPackageMapper.findForRepeatedPackages(); List<UserPackage> packagesRepeated = userPackageMapper.findForRepeatedPackages();
packagesRepeated.forEach(userPackage -> { packagesRepeated.forEach(userPackage -> {
Long packageId = userPackage.getId(); Long packageId = userPackage.getId();
SetupParam setupParam = new SetupParam(packageId, null, PipelineMode.RESEND); SetupParam setupParam = new SetupParam(packageId, 1, PipelineMode.RESEND);
try { try {
Pipeline makeXmlByCache = npPipelinePackageFabric.build(setupParam); Pipeline makeXmlByCache = npPipelinePackageFabric.build(setupParam);
pipelinePackageOrchestrator.startOrDelay(makeXmlByCache, packageId); pipelinePackageOrchestrator.startOrDelay(makeXmlByCache, packageId);
@ -82,7 +82,7 @@ public class UpdatingFidService {
} }
} }
@Scheduled(cron = "${ct.update-fid-cron-expression}") @Scheduled(cron = "${ct.update-fid-cron-expression}") // TODO another property
public void updateLp() { public void updateLp() {
// TODO // TODO
} }

View file

@ -8,6 +8,8 @@ import org.springframework.stereotype.Service;
import ru.nbch.credit_tracker.entities.app.LegalsMap; import ru.nbch.credit_tracker.entities.app.LegalsMap;
import ru.nbch.credit_tracker.entities.app.PackagesRecordsMap; import ru.nbch.credit_tracker.entities.app.PackagesRecordsMap;
import ru.nbch.credit_tracker.entities.app.PhonesMap; import ru.nbch.credit_tracker.entities.app.PhonesMap;
import ru.nbch.credit_tracker.entities.app.SignalLegalFidMap;
import ru.nbch.credit_tracker.mapper.signal.LegalsFidMapMapper;
import ru.nbch.credit_tracker.mapper.signal.LegalsMapMapper; import ru.nbch.credit_tracker.mapper.signal.LegalsMapMapper;
import ru.nbch.credit_tracker.mapper.signal.PackagesRecordsMapper; import ru.nbch.credit_tracker.mapper.signal.PackagesRecordsMapper;
import ru.nbch.credit_tracker.mapper.signal.PhonesMapMapper; import ru.nbch.credit_tracker.mapper.signal.PhonesMapMapper;
@ -33,15 +35,18 @@ public class PackageRecordsService {
private final PhonesMapMapper phonesMapMapper; private final PhonesMapMapper phonesMapMapper;
private final LegalsMapMapper legalsMapMapper; private final LegalsMapMapper legalsMapMapper;
private final PackagesRecordsMapper packagesRecordsMapper; private final PackagesRecordsMapper packagesRecordsMapper;
private final LegalsFidMapMapper legalsFidMapMapper;
private final ObjectMapper entityToJsonMapper; private final ObjectMapper entityToJsonMapper;
public PackageRecordsService(PhonesMapMapper phonesMapMapper, public PackageRecordsService(PhonesMapMapper phonesMapMapper,
LegalsMapMapper legalsMapMapper, LegalsMapMapper legalsMapMapper,
PackagesRecordsMapper packagesRecordsMapper, PackagesRecordsMapper packagesRecordsMapper,
LegalsFidMapMapper legalsFidMapMapper,
ObjectMapper entityToJsonMapper) { ObjectMapper entityToJsonMapper) {
this.phonesMapMapper = phonesMapMapper; this.phonesMapMapper = phonesMapMapper;
this.legalsMapMapper = legalsMapMapper; this.legalsMapMapper = legalsMapMapper;
this.packagesRecordsMapper = packagesRecordsMapper; this.packagesRecordsMapper = packagesRecordsMapper;
this.legalsFidMapMapper = legalsFidMapMapper;
this.entityToJsonMapper = entityToJsonMapper; this.entityToJsonMapper = entityToJsonMapper;
} }
@ -75,6 +80,10 @@ public class PackageRecordsService {
return packagesRecordsMapper.findFullPhoneFidMap(packageId, limit, offset); return packagesRecordsMapper.findFullPhoneFidMap(packageId, limit, offset);
} }
public List<SignalLegalFidMap> findFullLegalFidMap(Long packageId, Integer limit, int offset) {
return legalsFidMapMapper.findFullLegalFidMap(packageId, limit, offset);
}
public void saveToCache(List<PhonesMap> phonesMaps) { public void saveToCache(List<PhonesMap> phonesMaps) {
try { try {
String json = entityToJsonMapper.writeValueAsString(phonesMaps.stream() String json = entityToJsonMapper.writeValueAsString(phonesMaps.stream()

View file

@ -1,42 +0,0 @@
package ru.nbch.credit_tracker.service.task.impl;
import java.util.ArrayList;
import java.util.List;
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
import ru.nbch.credit_tracker.entities.app.PackagesRecordsMap;
import ru.nbch.credit_tracker.mapper.signal.UserPackageMapper;
import ru.nbch.credit_tracker.service.signal.PackageRecordsService;
import ru.nbch.credit_tracker.service.task.SetupParam;
public class KickPipeLineRepeatedRestoreImpl extends KickPipeLine {
private boolean oldRowsWereFound = false;
private final Integer daysToUpdateFlags;
public KickPipeLineRepeatedRestoreImpl(SetupParam setupParam,
UserPackageMapper userPackageMapper,
PackageRecordsService packageRecordsService,
CreditTrackerSettings creditTrackerSettings) {
super(setupParam, userPackageMapper, packageRecordsService, creditTrackerSettings);
this.daysToUpdateFlags = creditTrackerSettings.getDaysToUpdateFlags();
}
@Override
protected PipelineMode mode() {
return PipelineMode.RESTORE;
}
@Override
protected List<PackagesRecordsMap> nextPage(Integer limit) {
List<PackagesRecordsMap> pageWithNullFids = new ArrayList<>();
//fixme здесь должен быть запрос к таблице signals_phones_map, см. xml маппер
// if (!oldRowsWereFound) {
// pageWithNullFids = phoneFidMapMapper.pageByPackageIdAndOlderThanN(packageId, limit, offset, daysToUpdateFlags);
// }
// if (pageWithNullFids.isEmpty()) {
// oldRowsWereFound = true;
// offset = 0;
// return phoneFidMapMapper.pageByPackageIdAndNewerThanN(packageId, limit, offset, daysToUpdateFlags);
// }
return pageWithNullFids;
}
}

View file

@ -1,42 +0,0 @@
package ru.nbch.credit_tracker.service.task.impl;
import java.util.ArrayList;
import java.util.List;
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
import ru.nbch.credit_tracker.entities.app.PackagesRecordsMap;
import ru.nbch.credit_tracker.mapper.signal.UserPackageMapper;
import ru.nbch.credit_tracker.service.signal.PackageRecordsService;
import ru.nbch.credit_tracker.service.task.SetupParam;
public class KickPipeLineRestoreImpl extends KickPipeLine {
private boolean nullFidsWereFound = false;
public KickPipeLineRestoreImpl(SetupParam setupParam,
UserPackageMapper userPackageMapper,
PackageRecordsService packageRecordsService,
CreditTrackerSettings creditTrackerSettings) {
super(setupParam, userPackageMapper, packageRecordsService, creditTrackerSettings);
}
@Override
protected PipelineMode mode() {
return PipelineMode.REPEATED_RESTORE;
}
@Override
protected List<PackagesRecordsMap> nextPage(Integer limit) {
//todo рассмотреть к удалению
List<PackagesRecordsMap> page = new ArrayList<>();
// if (!nullFidsWereFound) {
// page = phoneFidMapMapper.findNullFidPhoneFidMap(packageId, limit, offset);
// }
// if (page.isEmpty()) {
// if (!nullFidsWereFound) {
// nullFidsWereFound = true;
// offset = 0;
// }
// return phoneFidMapMapper.findNotNullFidPhoneFidMap(packageId, limit, offset);
// }
return page;
}
}

View file

@ -0,0 +1,111 @@
package ru.nbch.credit_tracker.service.task.impl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
import ru.nbch.credit_tracker.entities.app.SignalLegalFidMap;
import ru.nbch.credit_tracker.entities.app.UserPackage;
import ru.nbch.credit_tracker.enums.PoisonType;
import ru.nbch.credit_tracker.exceptions.SignalClientException;
import ru.nbch.credit_tracker.mapper.signal.UserPackageMapper;
import ru.nbch.credit_tracker.model.SubjectProfile;
import ru.nbch.credit_tracker.model.impl.PackageVariable;
import ru.nbch.credit_tracker.model.impl.SubjectPayload;
import ru.nbch.credit_tracker.service.signal.PackageRecordsService;
import ru.nbch.credit_tracker.service.task.SetupParam;
import ru.nbch.credit_tracker.utils.error.ExceptionUtils;
import ru.nbch.pipeline.engine.core.PipelineContext;
import ru.nbch.pipeline.engine.core.setup.IPipeLineStarter;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.atomic.AtomicInteger;
public abstract class LpKickPipeLine implements IPipeLineStarter<SubjectPayload> {
private final Logger log = LoggerFactory.getLogger(getClass());
protected final Long packageId;
protected final PipelineMode mode;
protected final UserPackageMapper userPackageMapper;
protected final PackageRecordsService packageRecordsService;
protected final CreditTrackerSettings creditTrackerSettings;
private final int BATCH_SIZE;
private boolean isInterrupted = false;
protected int offset = 0;
private PipelineContext<PackageVariable> context;
public LpKickPipeLine(SetupParam setupParam,
UserPackageMapper userPackageMapper,
PackageRecordsService packageRecordsService,
CreditTrackerSettings creditTrackerSettings) {
this.packageId = setupParam.packageId();
this.userPackageMapper = userPackageMapper;
this.packageRecordsService = packageRecordsService;
this.creditTrackerSettings = creditTrackerSettings;
this.BATCH_SIZE = creditTrackerSettings.getLpPipeline().subjectBatchSize();
this.mode = setupParam.mode();
}
private static class PipelineStarterException extends SignalClientException {
public PipelineStarterException() {
super(null, null, null);
}
}
@SuppressWarnings("unchecked")
@Override
public void setContext(PipelineContext<?> context) {
this.context = (PipelineContext<PackageVariable>) context;
}
@Override
public void startFillingQueue(BlockingQueue<SubjectPayload> firstQueue) {
try {
log.info("Start kicker: mode:{}, packageId: {};", mode(), packageId);
context.store(PackageVariable.packageId, packageId);
context.store(PackageVariable.cacheMisses, new AtomicInteger());
context.store(PackageVariable.cacheHits, new AtomicInteger());
context.store(PackageVariable.mode, mode);
int limit = BATCH_SIZE;
UserPackage userPackage = userPackageMapper.findPackage(packageId);
List<SignalLegalFidMap> page = nextPage(limit);
while (!page.isEmpty()) {
log.debug("Get page {}", page.size());
List<SubjectProfile> subjectProfiles = page.stream().map(legalFidMap -> SubjectProfile.builder()
.mapId(legalFidMap.getId())
.identifier(legalFidMap.getSubjectId())
.inn(legalFidMap.getInn())
.regNum(legalFidMap.getRegNum())
.build()).toList();
try {
SubjectPayload payload = new SubjectPayload(packageId, userPackage.getUserId(), userPackage.getPackageName(), subjectProfiles);
payload.setContext(context);
firstQueue.put(payload);
} catch (InterruptedException e) {
isInterrupted = true;
log.error("Pipeline starter was interrupted!");
throw new PipelineStarterException();
}
offset += limit;
page = nextPage(limit);
}
} catch (PipelineStarterException e) {
log.info("Pipeline starter shutting down...");
} finally {
if (isInterrupted) {
//noinspection ReturnInsideFinallyBlock
return;
}
log.debug("Send poison pill");
try {
SubjectPayload poison = new SubjectPayload(packageId, PoisonType.NORMALLY);
firstQueue.put(poison);
} catch (InterruptedException e) {
log.error("couldn't send poison: {}", ExceptionUtils.getStackTrace(e));
}
}
}
protected abstract PipelineMode mode();
protected abstract List<SignalLegalFidMap> nextPage(Integer limit);
}

View file

@ -0,0 +1,26 @@
package ru.nbch.credit_tracker.service.task.impl;
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
import ru.nbch.credit_tracker.entities.app.SignalLegalFidMap;
import ru.nbch.credit_tracker.mapper.signal.UserPackageMapper;
import ru.nbch.credit_tracker.service.signal.PackageRecordsService;
import ru.nbch.credit_tracker.service.task.SetupParam;
import java.util.List;
public class LpKickPipelineDefaultImpl extends LpKickPipeLine{
public LpKickPipelineDefaultImpl(SetupParam setupParam, UserPackageMapper userPackageMapper, PackageRecordsService packageRecordsService, CreditTrackerSettings creditTrackerSettings) {
super(setupParam, userPackageMapper, packageRecordsService, creditTrackerSettings);
}
@Override
protected PipelineMode mode() {
return PipelineMode.DEFAULT;
}
@Override
protected List<SignalLegalFidMap> nextPage(Integer limit) {
return packageRecordsService.findFullLegalFidMap(packageId, limit, offset);
}
}

View file

@ -0,0 +1,112 @@
package ru.nbch.credit_tracker.service.task.impl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
import ru.nbch.credit_tracker.entities.app.LegalsMap;
import ru.nbch.credit_tracker.enums.PoisonType;
import ru.nbch.credit_tracker.exceptions.SignalClientException;
import ru.nbch.credit_tracker.mapper.signal.LegalsMapMapper;
import ru.nbch.credit_tracker.mapper.signal.UserPackageMapper;
import ru.nbch.credit_tracker.model.SubjectProfile;
import ru.nbch.credit_tracker.model.impl.PackageVariable;
import ru.nbch.credit_tracker.model.impl.SubjectPayload;
import ru.nbch.credit_tracker.service.signal.PackageRecordsService;
import ru.nbch.credit_tracker.service.task.SetupParam;
import ru.nbch.credit_tracker.utils.error.ExceptionUtils;
import ru.nbch.pipeline.engine.core.PipelineContext;
import ru.nbch.pipeline.engine.core.setup.IPipeLineStarter;
import java.util.List;
import java.util.concurrent.BlockingQueue;
public class LpKickRecalcPipeLine implements IPipeLineStarter<SubjectPayload> {
private final Logger log = LoggerFactory.getLogger(getClass());
protected final Long packageId;
protected final UserPackageMapper userPackageMapper;
protected final LegalsMapMapper legalsMapMapper;
protected final PackageRecordsService packageRecordsService;
protected final CreditTrackerSettings creditTrackerSettings;
private final int BATCH_SIZE;
private final Long daysToUpdateFids;
private boolean isInterrupted = false;
private PipelineContext<PackageVariable> context;
public LpKickRecalcPipeLine(SetupParam setupParam,
UserPackageMapper userPackageMapper,
LegalsMapMapper legalsMapMapper,
PackageRecordsService packageRecordsService,
CreditTrackerSettings creditTrackerSettings) {
this.packageId = setupParam.packageId();
this.userPackageMapper = userPackageMapper;
this.legalsMapMapper = legalsMapMapper;
this.packageRecordsService = packageRecordsService;
this.creditTrackerSettings = creditTrackerSettings;
this.BATCH_SIZE = creditTrackerSettings.getLpPipeline().subjectBatchSize();
this.daysToUpdateFids = creditTrackerSettings.getDaysToUpdateFids() != null ? creditTrackerSettings.getDaysToUpdateFids() : 1;
}
private static class PipelineStarterException extends SignalClientException {
public PipelineStarterException() {
super(null, null, null);
}
}
@SuppressWarnings("unchecked")
@Override
public void setContext(PipelineContext<?> context) {
this.context = (PipelineContext<PackageVariable>) context;
}
@Override
public void startFillingQueue(BlockingQueue<SubjectPayload> firstQueue) {
try {
log.info("Start kicker: mode:{};", mode());
long lastId = 0;
List<LegalsMap> page = nextPage(lastId);
while (!page.isEmpty()) {
log.debug("Get page {}", page.size());
List<SubjectProfile> subjectProfiles = page.stream().map(legalsMap -> SubjectProfile.builder()
.mapId(legalsMap.getId())
.inn(legalsMap.getInn())
.regNum(legalsMap.getRegNum())
.fid(legalsMap.getFid())
.build()).toList();
try {
SubjectPayload payload = new SubjectPayload(null, null, null, subjectProfiles);
payload.setContext(context);
firstQueue.put(payload);
} catch (InterruptedException e) {
isInterrupted = true;
log.error("Pipeline starter was interrupted!");
throw new PipelineStarterException();
}
lastId = page.getLast().getId();
page = nextPage(lastId);
}
} catch (PipelineStarterException e) {
log.info("Pipeline starter shutting down...");
} finally {
if (isInterrupted) {
//noinspection ReturnInsideFinallyBlock
return;
}
log.debug("Send poison pill");
try {
SubjectPayload poison = new SubjectPayload(packageId, PoisonType.NORMALLY);
firstQueue.put(poison);
} catch (InterruptedException e) {
log.error("couldn't send poison: {}", ExceptionUtils.getStackTrace(e));
}
}
}
protected PipelineMode mode() {
return PipelineMode.RECALC_FID;
}
protected List<LegalsMap> nextPage(long lastId) {
return legalsMapMapper.searchedAtLessThan(daysToUpdateFids.intValue(), BATCH_SIZE, lastId);
}
}

View file

@ -21,7 +21,7 @@ import java.util.List;
import java.util.concurrent.BlockingQueue; import java.util.concurrent.BlockingQueue;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
public abstract class KickPipeLine implements IPipeLineStarter<SubjectPayload> { public abstract class NpKickPipeLine 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 PipelineMode mode; protected final PipelineMode mode;
@ -34,10 +34,10 @@ public abstract class KickPipeLine implements IPipeLineStarter<SubjectPayload> {
private PipelineContext<PackageVariable> context; private PipelineContext<PackageVariable> context;
public KickPipeLine(SetupParam setupParam, public NpKickPipeLine(SetupParam setupParam,
UserPackageMapper userPackageMapper, UserPackageMapper userPackageMapper,
PackageRecordsService packageRecordsService, PackageRecordsService packageRecordsService,
CreditTrackerSettings creditTrackerSettings) { CreditTrackerSettings creditTrackerSettings) {
this.packageId = setupParam.packageId(); this.packageId = setupParam.packageId();
this.userPackageMapper = userPackageMapper; this.userPackageMapper = userPackageMapper;
this.packageRecordsService = packageRecordsService; this.packageRecordsService = packageRecordsService;

View file

@ -1,19 +1,19 @@
package ru.nbch.credit_tracker.service.task.impl; package ru.nbch.credit_tracker.service.task.impl;
import java.util.List;
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings; import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
import ru.nbch.credit_tracker.entities.app.PackagesRecordsMap; import ru.nbch.credit_tracker.entities.app.PackagesRecordsMap;
import ru.nbch.credit_tracker.mapper.signal.UserPackageMapper; import ru.nbch.credit_tracker.mapper.signal.UserPackageMapper;
import ru.nbch.credit_tracker.service.signal.PackageRecordsService; import ru.nbch.credit_tracker.service.signal.PackageRecordsService;
import ru.nbch.credit_tracker.service.task.SetupParam; import ru.nbch.credit_tracker.service.task.SetupParam;
public class KickPipeLineDefaultImpl extends KickPipeLine { import java.util.List;
private boolean cachedPhonesWereFound = false;
public KickPipeLineDefaultImpl(SetupParam setupParam, public class NpKickPipeLineDefaultImpl extends NpKickPipeLine {
UserPackageMapper userPackageMapper,
PackageRecordsService packageRecordsService, public NpKickPipeLineDefaultImpl(SetupParam setupParam,
CreditTrackerSettings creditTrackerSettings) { UserPackageMapper userPackageMapper,
PackageRecordsService packageRecordsService,
CreditTrackerSettings creditTrackerSettings) {
super(setupParam, userPackageMapper, packageRecordsService, creditTrackerSettings); super(setupParam, userPackageMapper, packageRecordsService, creditTrackerSettings);
} }

View file

@ -20,7 +20,7 @@ import ru.nbch.pipeline.engine.core.setup.IPipeLineStarter;
import java.util.List; import java.util.List;
import java.util.concurrent.BlockingQueue; import java.util.concurrent.BlockingQueue;
public class KickRecalcPipeLine implements IPipeLineStarter<SubjectPayload> { public class NpKickRecalcPipeLine 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;
@ -33,11 +33,11 @@ public class KickRecalcPipeLine implements IPipeLineStarter<SubjectPayload> {
private PipelineContext<PackageVariable> context; private PipelineContext<PackageVariable> context;
public KickRecalcPipeLine(SetupParam setupParam, public NpKickRecalcPipeLine(SetupParam setupParam,
UserPackageMapper userPackageMapper, UserPackageMapper userPackageMapper,
PhonesMapMapper phonesMapMapper, PhonesMapMapper phonesMapMapper,
PackageRecordsService packageRecordsService, PackageRecordsService packageRecordsService,
CreditTrackerSettings creditTrackerSettings) { CreditTrackerSettings creditTrackerSettings) {
this.packageId = setupParam.packageId(); this.packageId = setupParam.packageId();
this.userPackageMapper = userPackageMapper; this.userPackageMapper = userPackageMapper;
this.phonesMapMapper = phonesMapMapper; this.phonesMapMapper = phonesMapMapper;
@ -102,7 +102,7 @@ public class KickRecalcPipeLine implements IPipeLineStarter<SubjectPayload> {
} }
protected PipelineMode mode() { protected PipelineMode mode() {
return PipelineMode.REPEATED_RESTORE; return PipelineMode.RECALC_FID;
} }
protected List<PhonesMap> nextPage(long lastId) { protected List<PhonesMap> nextPage(long lastId) {
return phonesMapMapper.searchedAtLessThan(daysToUpdateFids.intValue(), BATCH_SIZE, lastId); return phonesMapMapper.searchedAtLessThan(daysToUpdateFids.intValue(), BATCH_SIZE, lastId);

View file

@ -8,8 +8,5 @@ package ru.nbch.credit_tracker.service.task.impl;
public enum PipelineMode { public enum PipelineMode {
DEFAULT, DEFAULT,
RESEND, RESEND,
RESTORE, RECALC_FID
REPEATED_RESTORE,
RECALC_PERSONAL_DATA,
MAKE_XML_BY_REPEATED
} }

View file

@ -5,6 +5,14 @@
<mapper namespace="ru.nbch.credit_tracker.mapper.signal.LegalsFidMapMapper"> <mapper namespace="ru.nbch.credit_tracker.mapper.signal.LegalsFidMapMapper">
<resultMap id="LegalFidMapResultMap" type="ru.nbch.credit_tracker.entities.app.SignalLegalFidMap">
<result property="id" column="id"/>
<result property="packageId" column="package_id"/>
<result property="subjectId" column="subject_id"/>
<result property="inn" column="inn"/>
<result property="regNum" column="reg_num"/>
</resultMap>
<select id="registerJson" parameterType="string" resultType="long"> <select id="registerJson" parameterType="string" resultType="long">
WITH src AS (SELECT row_number() OVER () AS rn, WITH src AS (SELECT row_number() OVER () AS rn,
subject_id, subject_id,
@ -29,4 +37,16 @@
RETURNING id; RETURNING id;
</select> </select>
<select id="findFullLegalFidMap" resultMap="LegalFidMapResultMap" resultType="java.util.List">
SELECT id,
package_id,
subject_id,
inn,
reg_num
FROM signals_legal_fid_map
WHERE package_id = #{packageId}
ORDER BY id
LIMIT #{limit} OFFSET #{offset}
</select>
</mapper> </mapper>

View file

@ -126,4 +126,19 @@
AND dst.id IN (SELECT id FROM to_lock); AND dst.id IN (SELECT id FROM to_lock);
</update> </update>
<select id="searchedAtLessThan" resultMap="LegalsMap">
select id,
inn,
reg_num,
fid,
searched_at,
flag_90_12,
calculated_at,
last_rejected_date
FROM signals_legals_map
WHERE searched_at &lt; now() - make_interval(days => #{daysCount}) and id > #{lastId}
order by id
limit #{batchSize}
</select>
</mapper> </mapper>

View file

@ -10,15 +10,13 @@
<result property="packageId" column="package_id"/> <result property="packageId" column="package_id"/>
<result property="subjectId" column="subject_id"/> <result property="subjectId" column="subject_id"/>
<result property="phone_l" column="phone_l"/> <result property="phone_l" column="phone_l"/>
<result property="errorText" column="error_text"/>
</resultMap> </resultMap>
<select id="findById" parameterType="long" resultMap="PhoneFidMapResultMap"> <select id="findById" parameterType="long" resultMap="PhoneFidMapResultMap">
SELECT id, SELECT id,
package_id, package_id,
subject_id, subject_id,
phone_l, phone_l
error_text
FROM signals_phone_fid_map FROM signals_phone_fid_map
WHERE id = #{id} WHERE id = #{id}
</select> </select>
@ -27,8 +25,7 @@
SELECT id, SELECT id,
package_id, package_id,
subject_id, subject_id,
phone_l, phone_l
error_text
FROM signals_phone_fid_map FROM signals_phone_fid_map
WHERE phone_l = #{phone} WHERE phone_l = #{phone}
</select> </select>
@ -37,8 +34,7 @@
SELECT id, SELECT id,
package_id, package_id,
subject_id, subject_id,
phone_l, phone_l
error_text
FROM signals_phone_fid_map FROM signals_phone_fid_map
WHERE phone_l IN WHERE phone_l IN
<foreach item='phone' collection='phones' open='(' separator=',' close=')'> <foreach item='phone' collection='phones' open='(' separator=',' close=')'>
@ -114,8 +110,7 @@
SELECT id, SELECT id,
package_id, package_id,
subject_id, subject_id,
phone_l, phone_l
error_text
FROM signals_phone_fid_map FROM signals_phone_fid_map
WHERE package_id = #{packageId} WHERE package_id = #{packageId}
ORDER BY id ORDER BY id