add new tables
This commit is contained in:
parent
015c7ca24b
commit
0f98d8d28d
13 changed files with 175 additions and 31 deletions
|
|
@ -11,7 +11,7 @@ ct.indic-data-source-settings.driver=com.ibm.db2.jcc.DB2Driver
|
||||||
ct.indic-data-source-settings.url=${DB_URL_INDIC:jdbc:db2://10.230.227.100:2668/cprosd22:currentSchema=INDIC;}
|
ct.indic-data-source-settings.url=${DB_URL_INDIC:jdbc:db2://10.230.227.100:2668/cprosd22:currentSchema=INDIC;}
|
||||||
ct.indic-data-source-settings.username=${USERNAME_INDIC:ros9appl}
|
ct.indic-data-source-settings.username=${USERNAME_INDIC:ros9appl}
|
||||||
ct.indic-data-source-settings.password=${PASSWORD_INDIC:R0s9Appl}
|
ct.indic-data-source-settings.password=${PASSWORD_INDIC:R0s9Appl}
|
||||||
ct.indic-data-source-settings.maximum-pool-size=${MAXIMUM_POOL_SIZE_INDIC:10}
|
ct.indic-data-source-settings.maximum-pool-size=${MAXIMUM_POOL_SIZE_INDIC:30}
|
||||||
ct.indic-data-source-settings.minimum-idle=${MINIMUM_IDLE_INDIC:10}
|
ct.indic-data-source-settings.minimum-idle=${MINIMUM_IDLE_INDIC:10}
|
||||||
ct.indic-data-source-settings.connection-timeout=${CONNECTION_TIMEOUT_INDIC:10000}
|
ct.indic-data-source-settings.connection-timeout=${CONNECTION_TIMEOUT_INDIC:10000}
|
||||||
ct.indic-data-source-settings.validation-timeout=${VALIDATION_TIMEOUT_INDIC:5000}
|
ct.indic-data-source-settings.validation-timeout=${VALIDATION_TIMEOUT_INDIC:5000}
|
||||||
|
|
@ -25,7 +25,7 @@ ct.signal-data-source-settings.driver=org.postgresql.Driver
|
||||||
ct.signal-data-source-settings.url=${DB_URL_SIGNAL:jdbc:postgresql://10.200.200.133:5432/credit_tracker}
|
ct.signal-data-source-settings.url=${DB_URL_SIGNAL:jdbc:postgresql://10.200.200.133:5432/credit_tracker}
|
||||||
ct.signal-data-source-settings.username=${USERNAME_SIGNAL:credit_tracker_user}
|
ct.signal-data-source-settings.username=${USERNAME_SIGNAL:credit_tracker_user}
|
||||||
ct.signal-data-source-settings.password=${PASSWORD_SIGNAL:-}
|
ct.signal-data-source-settings.password=${PASSWORD_SIGNAL:-}
|
||||||
ct.signal-data-source-settings.maximum-pool-size=${MAXIMUM_POOL_SIZE_SIGNAL:10}
|
ct.signal-data-source-settings.maximum-pool-size=${MAXIMUM_POOL_SIZE_SIGNAL:40}
|
||||||
ct.signal-data-source-settings.minimum-idle=${MINIMUM_IDLE_SIGNAL:10}
|
ct.signal-data-source-settings.minimum-idle=${MINIMUM_IDLE_SIGNAL:10}
|
||||||
ct.signal-data-source-settings.connection-timeout=${CONNECTION_TIMEOUT_SIGNAL:10000}
|
ct.signal-data-source-settings.connection-timeout=${CONNECTION_TIMEOUT_SIGNAL:10000}
|
||||||
ct.signal-data-source-settings.validation-timeout=${VALIDATION_TIMEOUT_SIGNAL:5000}
|
ct.signal-data-source-settings.validation-timeout=${VALIDATION_TIMEOUT_SIGNAL:5000}
|
||||||
|
|
@ -39,7 +39,7 @@ ct.scoring-data-source-settings.driver=com.ibm.db2.jcc.DB2Driver
|
||||||
ct.scoring-data-source-settings.url=${DB_URL_SCORING:jdbc:db2://10.230.227.101:2668/cprosd22:currentSchema=TEST_2_INDIC;}
|
ct.scoring-data-source-settings.url=${DB_URL_SCORING:jdbc:db2://10.230.227.101:2668/cprosd22:currentSchema=TEST_2_INDIC;}
|
||||||
ct.scoring-data-source-settings.username=${USERNAME_SCORING:tester}
|
ct.scoring-data-source-settings.username=${USERNAME_SCORING:tester}
|
||||||
ct.scoring-data-source-settings.password=${PASSWORD_SCORING:tester}
|
ct.scoring-data-source-settings.password=${PASSWORD_SCORING:tester}
|
||||||
ct.scoring-data-source-settings.maximum-pool-size=${MAXIMUM_POOL_SIZE_SCORING:10}
|
ct.scoring-data-source-settings.maximum-pool-size=${MAXIMUM_POOL_SIZE_SCORING:30}
|
||||||
ct.scoring-data-source-settings.minimum-idle=${MINIMUM_IDLE_SCORING:10}
|
ct.scoring-data-source-settings.minimum-idle=${MINIMUM_IDLE_SCORING:10}
|
||||||
ct.scoring-data-source-settings.connection-timeout=${CONNECTION_TIMEOUT_SCORING:10000}
|
ct.scoring-data-source-settings.connection-timeout=${CONNECTION_TIMEOUT_SCORING:10000}
|
||||||
ct.scoring-data-source-settings.validation-timeout=${VALIDATION_TIMEOUT_SCORING:5000}
|
ct.scoring-data-source-settings.validation-timeout=${VALIDATION_TIMEOUT_SCORING:5000}
|
||||||
|
|
@ -56,7 +56,7 @@ spring.servlet.multipart.max-request-size=${ACCEPTED_ARCHIVE_SIZE:2048MB}
|
||||||
ct.xsd-validation.monitoring-request-path=monitoring-request.xsd
|
ct.xsd-validation.monitoring-request-path=monitoring-request.xsd
|
||||||
ct.xsd-validation.signal-package-path=signal-package.xsd
|
ct.xsd-validation.signal-package-path=signal-package.xsd
|
||||||
|
|
||||||
ct.signals-root-uri=${SIGNALS_ROOT_URI:http://10.230.227.102:11094/signalRUalfa/}
|
ct.signals-root-uri=${SIGNALS_ROOT_URI:http://127.0.01:11094/signalRUalfa/}
|
||||||
ct.signals-token=${SIGNALS_TOKEN:gttcHxwcGojoAvZK}
|
ct.signals-token=${SIGNALS_TOKEN:gttcHxwcGojoAvZK}
|
||||||
ct.signals-user=${SIGNALS_USER:0001ZZ000001}
|
ct.signals-user=${SIGNALS_USER:0001ZZ000001}
|
||||||
|
|
||||||
|
|
@ -73,7 +73,21 @@ ct.db-version=${DB_VERSION:1234}
|
||||||
|
|
||||||
ct.encoding=windows-1251
|
ct.encoding=windows-1251
|
||||||
|
|
||||||
#Batch size and global pipeline timeout
|
|
||||||
ct.batchSize=1000
|
#----------------------------Pipeline settings----------------------------#
|
||||||
#in minute
|
#???-?? ????????? ?? xml ?? ???? ????????????
|
||||||
ct.timeout=30
|
ct.saver-subject-batch-size=15000
|
||||||
|
ct.pipeline.subject-batch-size=5000
|
||||||
|
#????????? ? PHONE ? NAME + ?????? ? ???? SIGNALS_PHONE_FID_MAP
|
||||||
|
ct.pipeline.name-enricher-stage-concurrency=20
|
||||||
|
#????????? ? ID ? ?????? ????? xml ??? ??. ???????
|
||||||
|
ct.pipeline.id-enricher-stage-concurrency=10
|
||||||
|
#?????????? ??????? ??? ??????
|
||||||
|
ct.pipeline.error-attempt-count=5
|
||||||
|
#????? ???????? ????? ????????? ???????
|
||||||
|
ct.pipeline.error-attempt-delay=2s
|
||||||
|
#??????? ?? ???? ???????
|
||||||
|
ct.pipeline.global-timeout=2h
|
||||||
|
#???-?? ??????????? ???????????? ?????????????? ????????
|
||||||
|
ct.pipeline.parallel-requests=3
|
||||||
|
ct.pipeline.retryable-exceptions=org.springframework.dao.DataAccessException,org.springframework.dao.DataIntegrityViolationException
|
||||||
|
|
@ -35,4 +35,5 @@ public class CreditTrackerSettings {
|
||||||
private Long daysToUpdateFlags;
|
private Long daysToUpdateFlags;
|
||||||
private String encoding;
|
private String encoding;
|
||||||
private String dbVersion;
|
private String dbVersion;
|
||||||
|
private Integer saverSubjectBatchSize;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -17,5 +17,5 @@ public class UserPackage {
|
||||||
private String status;
|
private String status;
|
||||||
private LocalDateTime deactivatedAt;
|
private LocalDateTime deactivatedAt;
|
||||||
private String lastDownloadedReport;
|
private String lastDownloadedReport;
|
||||||
private LocalDateTime monitoringAt;
|
// private LocalDateTime monitoringAt;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -128,7 +128,7 @@ public class SignalFacadeV3 {
|
||||||
|
|
||||||
Long packageId = signalService.registerPackage(userId, packageName);
|
Long packageId = signalService.registerPackage(userId, packageName);
|
||||||
LogUtil.addMdcLogKey("%s %d".formatted(packageName, packageId));
|
LogUtil.addMdcLogKey("%s %d".formatted(packageName, packageId));
|
||||||
log.info("Package registered. PackageId {}. Status: {}", packageId, Status.PROCESSING.name());
|
log.info("Package registered. PackageId {}. Status: {}", packageId, Status.ACCEPTED.name());
|
||||||
pipelinePackageManager.buildAndRun(packageId, parsedFilePath);
|
pipelinePackageManager.buildAndRun(packageId, parsedFilePath);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
try {
|
try {
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ public interface PhoneFidMapMapper {
|
||||||
void setFidJson(@Param("json") String json);
|
void setFidJson(@Param("json") String json);
|
||||||
void registerWithId(@Param("phoneFidMap") List<PhoneFidMap> phoneFidMap);
|
void registerWithId(@Param("phoneFidMap") List<PhoneFidMap> phoneFidMap);
|
||||||
|
|
||||||
List<PhoneFidMap> findFullPhoneFidMap(@Param("packageId") Long packageId, @Param("offset") int offset, @Param("limit") int limit);
|
List<PhoneFidMap> findFullPhoneFidMap(@Param("packageId") Long packageId, @Param("limit") int limit, @Param("offset") int offset);
|
||||||
|
|
||||||
void updatePhoneFidMaps(@Param("subjects") Collection<PhoneFidMap> subjects);
|
void updatePhoneFidMaps(@Param("subjects") Collection<PhoneFidMap> subjects);
|
||||||
void updateOne(@Param("subject") PhoneFidMap subject);
|
void updateOne(@Param("subject") PhoneFidMap subject);
|
||||||
|
|
|
||||||
|
|
@ -37,15 +37,8 @@ public class PhoneRepository {
|
||||||
SELECT
|
SELECT
|
||||||
pn.number,
|
pn.number,
|
||||||
pn.fid,
|
pn.fid,
|
||||||
pn.file_since_dt,
|
pn.file_since_dt
|
||||||
nf.first,
|
|
||||||
nf.middle,
|
|
||||||
nf.name_1,
|
|
||||||
nf.birth_dt,
|
|
||||||
nf.file_since_dt as file_since_dt_name
|
|
||||||
FROM PHONE_NORM pn
|
FROM PHONE_NORM pn
|
||||||
JOIN NAME nf
|
|
||||||
ON nf.fid = pn.fid
|
|
||||||
WHERE number in (:phones) WITH UR
|
WHERE number in (:phones) WITH UR
|
||||||
""";
|
""";
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -69,9 +69,9 @@ public class UpdatingFlagsService {
|
||||||
SignalService.UpdateResult updateResult = signalService.updateSubjects(packageId, filter);
|
SignalService.UpdateResult updateResult = signalService.updateSubjects(packageId, filter);
|
||||||
if (updateResult.isUpdated()) {
|
if (updateResult.isUpdated()) {
|
||||||
if (signalRestService.setupMonitoring(packageId)) {
|
if (signalRestService.setupMonitoring(packageId)) {
|
||||||
LocalDateTime monitoringAt = userPackage.getMonitoringAt() != null ? userPackage.getMonitoringAt() : LocalDateTime.now();
|
// LocalDateTime monitoringAt = userPackage.getMonitoringAt() != null ? userPackage.getMonitoringAt() : LocalDateTime.now();
|
||||||
log.info("Flags were updated successfully. PackageId: {} PackageName: {} MonitoringAt: {}. Package status changed to ON_MONITORING", packageId, packageName, monitoringAt);
|
log.info("Flags were updated successfully. PackageId: {} PackageName: {}. Package status changed to ON_MONITORING", packageId, packageName);
|
||||||
signalService.updatePackageOnMonitoringSuccess(packageId, monitoringAt);
|
signalService.updatePackageOnMonitoringSuccess(packageId, LocalDateTime.now());
|
||||||
monitoringErrorProcesingService.findErrors(packageId);
|
monitoringErrorProcesingService.findErrors(packageId);
|
||||||
} else {
|
} else {
|
||||||
log.info("Updated package registration was rejected by signal service. PackageId: {} PackageName: {}", packageId, packageName);
|
log.info("Updated package registration was rejected by signal service. PackageId: {} PackageName: {}", packageId, packageName);
|
||||||
|
|
|
||||||
|
|
@ -90,4 +90,8 @@ public class PhoneService2 {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<PhoneFidMap> nextPage(Long packageId, Integer limit, Integer offset) {
|
||||||
|
return phoneFidMapMapper.findFullPhoneFidMap(packageId, limit, offset);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
package ru.nbch.credit_tracker.service.task;
|
package ru.nbch.credit_tracker.service.task;
|
||||||
|
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
import java.util.concurrent.Semaphore;
|
import java.util.concurrent.Semaphore;
|
||||||
|
|
@ -21,6 +22,7 @@ import ru.nbch.credit_tracker.service.task.impl.FidIdEnricher;
|
||||||
import ru.nbch.credit_tracker.service.task.impl.FidNameEnricher;
|
import ru.nbch.credit_tracker.service.task.impl.FidNameEnricher;
|
||||||
import ru.nbch.credit_tracker.service.task.impl.FlagsEnricher;
|
import ru.nbch.credit_tracker.service.task.impl.FlagsEnricher;
|
||||||
import ru.nbch.credit_tracker.service.task.impl.SaveSubjectHandler;
|
import ru.nbch.credit_tracker.service.task.impl.SaveSubjectHandler;
|
||||||
|
import ru.nbch.credit_tracker.service.task.impl.Saver;
|
||||||
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;
|
||||||
import ru.nbch.credit_tracker.service.task.setup.IPipeLineTerminator;
|
import ru.nbch.credit_tracker.service.task.setup.IPipeLineTerminator;
|
||||||
|
|
@ -48,8 +50,15 @@ public class PipelinePackageManager {
|
||||||
t.setName("pipe-starter-%d".formatted(t.threadId()));
|
t.setName("pipe-starter-%d".formatted(t.threadId()));
|
||||||
return t;
|
return t;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
private final ExecutorService subjectSaverExecutor = Executors.newFixedThreadPool(3, r -> {
|
||||||
|
Thread t = new Thread(r);
|
||||||
|
t.setName("subject-saver-%d".formatted(t.threadId()));
|
||||||
|
return t;
|
||||||
|
});
|
||||||
private final Semaphore semaphore;
|
private final Semaphore semaphore;
|
||||||
private final PipelineBackoff pipelineBackoff;
|
private final PipelineBackoff pipelineBackoff;
|
||||||
|
private final Saver saver;
|
||||||
private final static int MAX_PARALLEL_REQUESTS = 3;
|
private final static int MAX_PARALLEL_REQUESTS = 3;
|
||||||
|
|
||||||
public PipelinePackageManager(SignalRestService signalRestService,
|
public PipelinePackageManager(SignalRestService signalRestService,
|
||||||
|
|
@ -64,7 +73,7 @@ public class PipelinePackageManager {
|
||||||
BiFunction<Long, Path, IPipeLineStarter<SubjectPayload>> pipelineStarterFactory,
|
BiFunction<Long, Path, IPipeLineStarter<SubjectPayload>> pipelineStarterFactory,
|
||||||
FlagsEnricher flagsEnricherV2, FidNameEnricher fidNameEnricher,
|
FlagsEnricher flagsEnricherV2, FidNameEnricher fidNameEnricher,
|
||||||
CreditTrackerSettings creditTrackerSettings,
|
CreditTrackerSettings creditTrackerSettings,
|
||||||
PipelineBackoff pipelineBackoff) {
|
PipelineBackoff pipelineBackoff, Saver saver) {
|
||||||
this.signalRestService = signalRestService;
|
this.signalRestService = signalRestService;
|
||||||
this.saveSubjectQueueFactory = saveSubjectQueueFactory;
|
this.saveSubjectQueueFactory = saveSubjectQueueFactory;
|
||||||
this.idEnricherQueueFactory = idEnricherQueueFactory;
|
this.idEnricherQueueFactory = idEnricherQueueFactory;
|
||||||
|
|
@ -81,6 +90,7 @@ public class PipelinePackageManager {
|
||||||
this.semaphore = new Semaphore(creditTrackerSettings.getPipeline().parallelRequests());
|
this.semaphore = new Semaphore(creditTrackerSettings.getPipeline().parallelRequests());
|
||||||
log.info("pipeline settings: {}", creditTrackerSettings.getPipeline());
|
log.info("pipeline settings: {}", creditTrackerSettings.getPipeline());
|
||||||
this.pipelineBackoff = pipelineBackoff;
|
this.pipelineBackoff = pipelineBackoff;
|
||||||
|
this.saver = saver;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void buildAndRun(Long packageId, Path pkgPath) throws Exception {
|
public void buildAndRun(Long packageId, Path pkgPath) throws Exception {
|
||||||
|
|
@ -90,10 +100,7 @@ public class PipelinePackageManager {
|
||||||
log.info("throttler permits after acquire: {}", semaphore.availablePermits());
|
log.info("throttler permits after acquire: {}", semaphore.availablePermits());
|
||||||
long startTime = System.currentTimeMillis();
|
long startTime = System.currentTimeMillis();
|
||||||
try {
|
try {
|
||||||
Pipeline pipeline = PipeLineBuilderV2.first(saveSubjectQueueFactory.getObject(), idEnricherQueueFactory.getObject())
|
Pipeline pipeline = PipeLineBuilderV2.first(nameEnricherQueueFactory.getObject(), idEnricherQueueFactory.getObject())
|
||||||
.handler(saveSubjectHandler)
|
|
||||||
.andThen()
|
|
||||||
.stage(nameEnricherQueueFactory.getObject())
|
|
||||||
.handler(fidNameEnricher)
|
.handler(fidNameEnricher)
|
||||||
.handlerResult(flagsEnricherV2)
|
.handlerResult(flagsEnricherV2)
|
||||||
.andThen()
|
.andThen()
|
||||||
|
|
@ -106,7 +113,6 @@ public class PipelinePackageManager {
|
||||||
.backoff(pipelineBackoff)
|
.backoff(pipelineBackoff)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
pipeline.start(executorService);
|
|
||||||
pipeline.getTerminator()
|
pipeline.getTerminator()
|
||||||
.doneFuture()
|
.doneFuture()
|
||||||
.orTimeout(creditTrackerSettings.getPipeline().globalTimeout().toMillis(), TimeUnit.MILLISECONDS)
|
.orTimeout(creditTrackerSettings.getPipeline().globalTimeout().toMillis(), TimeUnit.MILLISECONDS)
|
||||||
|
|
@ -133,6 +139,17 @@ public class PipelinePackageManager {
|
||||||
log.info("semaphore amount: {}", semaphore.availablePermits());
|
log.info("semaphore amount: {}", semaphore.availablePermits());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
CompletableFuture
|
||||||
|
.runAsync(() -> {
|
||||||
|
try {
|
||||||
|
saver.readAndSave(packageId, pkgPath);
|
||||||
|
} catch (Throwable t) {
|
||||||
|
log.error(ExceptionUtils.getStackTrace(t));
|
||||||
|
pipeline.close();
|
||||||
|
}
|
||||||
|
}, subjectSaverExecutor)
|
||||||
|
.thenRun(() -> pipeline.start(executorService));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
semaphore.release();
|
semaphore.release();
|
||||||
throw e;
|
throw e;
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ import java.util.stream.Collectors;
|
||||||
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.PhoneFidMap;
|
||||||
import ru.nbch.credit_tracker.entities.app.UserPackage;
|
import ru.nbch.credit_tracker.entities.app.UserPackage;
|
||||||
import ru.nbch.credit_tracker.entities.user_request.monitoring_request.MonitoringRequest;
|
import ru.nbch.credit_tracker.entities.user_request.monitoring_request.MonitoringRequest;
|
||||||
import ru.nbch.credit_tracker.exceptions.SignalClientException;
|
import ru.nbch.credit_tracker.exceptions.SignalClientException;
|
||||||
|
|
@ -56,7 +57,47 @@ public class KickPipeLineImpl implements IPipeLineStarter<SubjectPayload> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void startFillingQueue(BlockingQueue<SubjectPayload> firstQueue) {
|
public void startFillingQueue(BlockingQueue<SubjectPayload> firstQueue) {
|
||||||
log.info("Start registering subjects. PackageId: {}", packageId);
|
try {
|
||||||
|
log.info("Start registering subjects. PackageId: {};", packageId);
|
||||||
|
int offset = 0;
|
||||||
|
int limit = BATCH_SIZE;
|
||||||
|
UserPackage userPackage = userPackageMapper.findPackage(packageId);
|
||||||
|
List<PhoneFidMap> page = phoneService2.nextPage(packageId, limit, offset);
|
||||||
|
while (!page.isEmpty()) {
|
||||||
|
log.debug("Get page {}", page.size());
|
||||||
|
List<SubjectProfile> subjectProfiles = page.stream().map(phoneFidMap -> SubjectProfile.builder()
|
||||||
|
.identifier(phoneFidMap.getSubjectId())
|
||||||
|
.phone(phoneFidMap.getPhone())
|
||||||
|
.build()).toList();
|
||||||
|
try {
|
||||||
|
firstQueue.put(new SubjectPayload(packageId, userPackage.getUserId(), userPackage.getPackageName(), subjectProfiles));
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
isInterrupted = true;
|
||||||
|
log.error("Pipeline starter was interrupted!");
|
||||||
|
throw new PipelineStarterException();
|
||||||
|
}
|
||||||
|
offset += limit;
|
||||||
|
page = phoneService2.nextPage(packageId, limit, offset);
|
||||||
|
}
|
||||||
|
} catch (PipelineStarterException e) {
|
||||||
|
log.info("Pipeline starter shitting 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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// @Override
|
||||||
|
public void startFillingQueueXml(BlockingQueue<SubjectPayload> firstQueue) {
|
||||||
|
log.info("Start registering subjects. PackageId: {}; pkg path: {}", packageId, pkgPath);
|
||||||
UserPackage userPackage = userPackageMapper.findPackage(packageId);
|
UserPackage userPackage = userPackageMapper.findPackage(packageId);
|
||||||
AtomicInteger counter = new AtomicInteger(0);
|
AtomicInteger counter = new AtomicInteger(0);
|
||||||
try (BufferedInputStream in = new BufferedInputStream(Files.newInputStream(pkgPath), 8 * 1024 * 1024)) {
|
try (BufferedInputStream in = new BufferedInputStream(Files.newInputStream(pkgPath), 8 * 1024 * 1024)) {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,72 @@
|
||||||
|
package ru.nbch.credit_tracker.service.task.impl;
|
||||||
|
|
||||||
|
import java.io.BufferedInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.List;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
||||||
|
import ru.nbch.credit_tracker.entities.app.PhoneFidMap;
|
||||||
|
import ru.nbch.credit_tracker.entities.user_request.monitoring_request.MonitoringRequest;
|
||||||
|
import ru.nbch.credit_tracker.enums.Status;
|
||||||
|
import ru.nbch.credit_tracker.mapper.signal.UserPackageMapper;
|
||||||
|
import ru.nbch.credit_tracker.model.SubjectProfile;
|
||||||
|
import ru.nbch.credit_tracker.service.indic.PhoneService2;
|
||||||
|
import ru.nbch.credit_tracker.service.xml.stax.StaxXmlProcessor;
|
||||||
|
import ru.nbch.credit_tracker.utils.error.ExceptionUtils;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class Saver {
|
||||||
|
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||||
|
private final StaxXmlProcessor xmlProcessor;
|
||||||
|
private final PhoneService2 phoneService2;
|
||||||
|
private final UserPackageMapper userPackageMapper;
|
||||||
|
private final int BATCH_SIZE;
|
||||||
|
|
||||||
|
|
||||||
|
public Saver(StaxXmlProcessor xmlProcessor,
|
||||||
|
PhoneService2 phoneService2,
|
||||||
|
UserPackageMapper userPackageMapper,
|
||||||
|
CreditTrackerSettings creditTrackerSettings) {
|
||||||
|
this.xmlProcessor = xmlProcessor;
|
||||||
|
this.phoneService2 = phoneService2;
|
||||||
|
this.userPackageMapper = userPackageMapper;
|
||||||
|
this.BATCH_SIZE = creditTrackerSettings.getSaverSubjectBatchSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void readAndSave(Long packageId, Path pkgPath) {
|
||||||
|
log.info("Start registering subjects. PackageId: {}; pkg path: {}", packageId, pkgPath);
|
||||||
|
try (BufferedInputStream in = new BufferedInputStream(Files.newInputStream(pkgPath), 8 * 1024 * 1024)) {
|
||||||
|
xmlProcessor.read(in, MonitoringRequest.class,
|
||||||
|
request -> {
|
||||||
|
if (!request.getSubjects().getSubject().isEmpty()) {
|
||||||
|
List<SubjectProfile> subjects = request.getSubjects().getSubject().stream().map(subject ->
|
||||||
|
SubjectProfile.builder()
|
||||||
|
.identifier(subject.getId())
|
||||||
|
.phone(subject.getClientId())
|
||||||
|
.build()
|
||||||
|
|
||||||
|
).toList();
|
||||||
|
log.trace("Reading subject's {} batch. PackageId: {}", request.getSubjects().getSubject().size(), packageId);
|
||||||
|
List<PhoneFidMap> subjectForSave = subjects.stream().map(subject -> PhoneFidMap.builder()
|
||||||
|
.subjectId(subject.getIdentifier())
|
||||||
|
.packageId(packageId)
|
||||||
|
.phone(subject.getPhone())
|
||||||
|
.build()).toList();
|
||||||
|
request.getSubjects().getSubject().clear();
|
||||||
|
phoneService2.registerSubjects(subjectForSave);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
request -> request.getSubjects().getSubject().isEmpty(),
|
||||||
|
BATCH_SIZE, "/MonitoringRequest/Subjects/Subject"
|
||||||
|
);
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("{}", ExceptionUtils.getStackTrace(e));
|
||||||
|
}
|
||||||
|
userPackageMapper.updatePackageStatus(packageId, Status.PROCESSING.name());
|
||||||
|
log.info("Complete registering subjects. PackageId: {}; pkg path: {}", packageId, pkgPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -68,6 +68,8 @@ public class LogUtil {
|
||||||
}
|
}
|
||||||
|
|
||||||
task.run();
|
task.run();
|
||||||
|
} catch (Throwable e) {
|
||||||
|
log.error(ExceptionUtils.getStackTrace(e));
|
||||||
} finally {
|
} finally {
|
||||||
// восстанавливаем предыдущий (может быть null)
|
// восстанавливаем предыдущий (может быть null)
|
||||||
try {
|
try {
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@
|
||||||
<result property="status" column="status"/>
|
<result property="status" column="status"/>
|
||||||
<result property="deactivatedAt" column="deactivated_at"/>
|
<result property="deactivatedAt" column="deactivated_at"/>
|
||||||
<result property="lastDownloadedReport" column="last_downloaded_report"/>
|
<result property="lastDownloadedReport" column="last_downloaded_report"/>
|
||||||
<result property="monitoringAt" column="monitoring_at"/>
|
<!-- <result property="monitoringAt" column="monitoring_at"/>-->
|
||||||
</resultMap>
|
</resultMap>
|
||||||
|
|
||||||
<select id="isPackageNotUnique" resultType="boolean">
|
<select id="isPackageNotUnique" resultType="boolean">
|
||||||
|
|
@ -90,7 +90,7 @@
|
||||||
|
|
||||||
<select id="findPackage" resultMap="packageDataResultMap"
|
<select id="findPackage" resultMap="packageDataResultMap"
|
||||||
resultType="ru.nbch.credit_tracker.entities.app.UserPackage">
|
resultType="ru.nbch.credit_tracker.entities.app.UserPackage">
|
||||||
SELECT id, membercode, package_name, created_at, status, deactivated_at, last_downloaded_report, monitoring_at
|
SELECT id, membercode, package_name, created_at, status, deactivated_at, last_downloaded_report
|
||||||
FROM signals_user_packages
|
FROM signals_user_packages
|
||||||
WHERE id = #{id}
|
WHERE id = #{id}
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue