Put finding fids and calculating debt flags into separate thread
This commit is contained in:
parent
c35498f8d5
commit
96e0f20ebd
3 changed files with 47 additions and 15 deletions
|
|
@ -5,6 +5,9 @@ import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.web.client.RestTemplate;
|
import org.springframework.web.client.RestTemplate;
|
||||||
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
||||||
|
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
public class RestConfig {
|
public class RestConfig {
|
||||||
|
|
||||||
|
|
@ -15,4 +18,9 @@ public class RestConfig {
|
||||||
restTemplate.setErrorHandler(new ResponseErrorHandler());
|
restTemplate.setErrorHandler(new ResponseErrorHandler());
|
||||||
return restTemplate;
|
return restTemplate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Bean(name = "executorService")
|
||||||
|
public ExecutorService executorService() {
|
||||||
|
return Executors.newCachedThreadPool();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
package ru.nbch.credit_tracker.facade;
|
package ru.nbch.credit_tracker.facade;
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.beans.factory.annotation.Qualifier;
|
||||||
import org.springframework.core.io.PathResource;
|
import org.springframework.core.io.PathResource;
|
||||||
import org.springframework.core.io.Resource;
|
import org.springframework.core.io.Resource;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
|
@ -20,6 +21,7 @@ import ru.nbch.credit_tracker.service.xml.IXmlProcessor;
|
||||||
import ru.nbch.credit_tracker.service.xml.XmlUtilService;
|
import ru.nbch.credit_tracker.service.xml.XmlUtilService;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.zip.ZipEntry;
|
import java.util.zip.ZipEntry;
|
||||||
import java.util.zip.ZipInputStream;
|
import java.util.zip.ZipInputStream;
|
||||||
|
|
||||||
|
|
@ -35,18 +37,23 @@ public class SignalFacade {
|
||||||
private final FailureAnswerGenerator failureAnswerGenerator;
|
private final FailureAnswerGenerator failureAnswerGenerator;
|
||||||
private final XmlUtilService xmlUtilService;
|
private final XmlUtilService xmlUtilService;
|
||||||
|
|
||||||
|
private final ExecutorService executor;
|
||||||
|
|
||||||
|
|
||||||
public SignalFacade(CreditTrackerSettings config,
|
public SignalFacade(CreditTrackerSettings config,
|
||||||
AuthorizationService authorizationService,
|
AuthorizationService authorizationService,
|
||||||
SignalService signalService,
|
SignalService signalService,
|
||||||
SignalRestService signalRestService,
|
SignalRestService signalRestService,
|
||||||
FailureAnswerGenerator failureAnswerGenerator,
|
FailureAnswerGenerator failureAnswerGenerator,
|
||||||
XmlUtilService xmlUtilService) {
|
XmlUtilService xmlUtilService,
|
||||||
|
@Qualifier("executorService") ExecutorService executor) {
|
||||||
this.config = config;
|
this.config = config;
|
||||||
this.authorizationService = authorizationService;
|
this.authorizationService = authorizationService;
|
||||||
this.signalService = signalService;
|
this.signalService = signalService;
|
||||||
this.signalRestService = signalRestService;
|
this.signalRestService = signalRestService;
|
||||||
this.failureAnswerGenerator = failureAnswerGenerator;
|
this.failureAnswerGenerator = failureAnswerGenerator;
|
||||||
this.xmlUtilService = xmlUtilService;
|
this.xmlUtilService = xmlUtilService;
|
||||||
|
this.executor = executor;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ResponseEntity<Resource> setupMonitoring(MultipartFile file) {
|
public ResponseEntity<Resource> setupMonitoring(MultipartFile file) {
|
||||||
|
|
@ -101,6 +108,7 @@ public class SignalFacade {
|
||||||
// Теперь знаем, что в архиве лежит ровно один файл с раширением xml и он весит меньше 2гб. Можно валидировать сам xml
|
// Теперь знаем, что в архиве лежит ровно один файл с раширением xml и он весит меньше 2гб. Можно валидировать сам xml
|
||||||
// Пробуем распарсить xml
|
// Пробуем распарсить xml
|
||||||
MonitoringRequest monitoringRequest;
|
MonitoringRequest monitoringRequest;
|
||||||
|
Integer packageId;
|
||||||
try (ZipInputStream zipInputStream = new ZipInputStream(file.getInputStream())) {
|
try (ZipInputStream zipInputStream = new ZipInputStream(file.getInputStream())) {
|
||||||
zipInputStream.getNextEntry();
|
zipInputStream.getNextEntry();
|
||||||
|
|
||||||
|
|
@ -132,25 +140,16 @@ public class SignalFacade {
|
||||||
return getBadResponse(SignalError.ERROR_007);
|
return getBadResponse(SignalError.ERROR_007);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<PhoneService.FidsPhoneData> phoneFidsData = signalService.registerPackage(monitoringRequest);
|
packageId = signalService.registerPackage(monitoringRequest);
|
||||||
if(!phoneFidsData.isEmpty()) {
|
|
||||||
Signals signals = signalService.buildSignals(monitoringRequest, phoneFidsData);
|
|
||||||
// TODO validate?
|
|
||||||
String response = signalRestService.update(signals);
|
|
||||||
if (response == null) {
|
|
||||||
signalService.setPackageStatus(monitoringRequest, Status.ON_MONITORING);
|
|
||||||
} else {
|
|
||||||
signalService.setPackageStatus(monitoringRequest, Status.ERROR);
|
|
||||||
return getBadResponse(SignalError.ERROR_100); // TODO ??? Ошибка от офф сервиса или вынос этой логики?
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error(e.getMessage(), e);
|
log.error(e.getMessage(), e);
|
||||||
String errorPath = failureAnswerGenerator.generateFailureAnswer(SignalError.ERROR_100);
|
String errorPath = failureAnswerGenerator.generateFailureAnswer(SignalError.ERROR_100);
|
||||||
return ResponseEntity.internalServerError().body(new PathResource(errorPath));
|
return ResponseEntity.internalServerError().body(new PathResource(errorPath));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// в отдельном потоке запускаем поиск фидов и расчет флагов просрочек
|
||||||
|
registerFidsAndDebts(monitoringRequest, packageId);
|
||||||
|
|
||||||
return ResponseEntity.ok().body(new PathResource("D:\\folder_name\\legal.xml")); // TODO generate success response
|
return ResponseEntity.ok().body(new PathResource("D:\\folder_name\\legal.xml")); // TODO generate success response
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -196,6 +195,27 @@ public class SignalFacade {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void registerFidsAndDebts(MonitoringRequest monitoringRequest, Integer packageId) {
|
||||||
|
executor.execute(() -> {
|
||||||
|
try {
|
||||||
|
List<PhoneService.FidsPhoneData> phoneFidsData = signalService.registerSubjectsFidAndDebts(monitoringRequest, packageId);
|
||||||
|
if(!phoneFidsData.isEmpty()) {
|
||||||
|
Signals signals = signalService.buildSignals(monitoringRequest, phoneFidsData);
|
||||||
|
// TODO validate xsd?
|
||||||
|
String response = null;
|
||||||
|
// response = signalRestService.update(signals);
|
||||||
|
if (response == null) {
|
||||||
|
signalService.setPackageStatus(monitoringRequest, Status.ON_MONITORING);
|
||||||
|
} else {
|
||||||
|
signalService.setPackageStatus(monitoringRequest, Status.ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("Ошибка при поиске фидов или расчете флагов просрочек", e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
private boolean isZipFile(MultipartFile file) {
|
private boolean isZipFile(MultipartFile file) {
|
||||||
return file.getContentType() != null &&
|
return file.getContentType() != null &&
|
||||||
(file.getContentType().equals("application/zip") || file.getContentType().equals("application/x-zip-compressed")) ||
|
(file.getContentType().equals("application/zip") || file.getContentType().equals("application/x-zip-compressed")) ||
|
||||||
|
|
|
||||||
|
|
@ -44,9 +44,13 @@ public class SignalService {
|
||||||
return mapper.isPackageNotUnique(userId.substring(0, 6), request.getPackageName());
|
return mapper.isPackageNotUnique(userId.substring(0, 6), request.getPackageName());
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<PhoneService.FidsPhoneData> registerPackage(MonitoringRequest request) {
|
public Integer registerPackage(MonitoringRequest request) {
|
||||||
Integer packageId = mapper.registerPackage(request, LocalDateTime.now(), Status.PROCESSING.name());
|
Integer packageId = mapper.registerPackage(request, LocalDateTime.now(), Status.PROCESSING.name());
|
||||||
mapper.registerSubjects(request.getSubjects().getSubject(), packageId);
|
mapper.registerSubjects(request.getSubjects().getSubject(), packageId);
|
||||||
|
return packageId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<PhoneService.FidsPhoneData> registerSubjectsFidAndDebts(MonitoringRequest request, Integer packageId) {
|
||||||
List<PhoneService.FidsPhoneData> fidsPhoneDataList = phoneService.findFidsPhoneData(request.getSubjects().getSubject());
|
List<PhoneService.FidsPhoneData> fidsPhoneDataList = phoneService.findFidsPhoneData(request.getSubjects().getSubject());
|
||||||
fidsPhoneDataList.forEach(phoneData -> {
|
fidsPhoneDataList.forEach(phoneData -> {
|
||||||
FlagsService.FlagsFidData flagsData = flagsService.findFlags(phoneData.getFid());
|
FlagsService.FlagsFidData flagsData = flagsService.findFlags(phoneData.getFid());
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue