update esnsi okopf

This commit is contained in:
Artyom Hackimullin 2025-01-23 12:36:15 +03:00
parent d764fb7eb1
commit 2aead95668
6 changed files with 22 additions and 21 deletions

View file

@ -22,25 +22,26 @@ import org.springframework.stereotype.Component;
*/
@Component
public class EsnsiOkopfClient {
private static final Logger LOGGER = LoggerFactory.getLogger(EsnsiOkopfClient.class);
private static final Logger logger = LoggerFactory.getLogger(EsnsiOkopfClient.class);
@Value("${esnsi.okopf.url}")
private String url;
@Retryable(maxAttemptsExpression = "${esnsi.okopf.retry.max.attempts.load:3}", backoff =
@Backoff(delayExpression = "${esnsi.okop.retry.delay.load:1000}"))
@Retryable(value = IOException.class, maxAttemptsExpression = "${esnsi.okopf.retry.max.attempts.load:3}", backoff =
@Backoff(delayExpression = "${esnsi.okop.retry.delay.load:30000}"))
public String getJsonOkopFormData() {
try (BufferedInputStream in = new BufferedInputStream(new URL(url).openStream());
ZipInputStream archiveStream = new ZipInputStream(in);
BufferedReader br = new BufferedReader(
new InputStreamReader(archiveStream, StandardCharsets.UTF_8))) {
if (Objects.nonNull(archiveStream.getNextEntry())) {
logger.info("Received an archive in response.");
return br.lines().collect(Collectors.joining(System.lineSeparator()));
}
LOGGER.warn("Esnsi okopf client received an empty archive in response.");
logger.info("Received an empty archive in response. Skipping load okpof file process");
}
catch (IOException e) {
LOGGER.error("Failed to send HTTP request or process the response for okopf file.", e);
catch (SecurityException | IOException e) {
logger.error("Failed to send HTTP request {} or process the response for okopf file.", url, e);
}
return null;
}

View file

@ -24,6 +24,7 @@ public class OkopfDaoImpl implements OkopfDao {
private DSLContext dsl;
@Override
@Transactional
public void saveOrUpdate(List<OkopfModel> okopfModels) {
deleteNotActualOkopfRecords(okopfModels);
dsl.batchMerge(okopfModels.stream()

View file

@ -5,7 +5,6 @@ import java.util.List;
import java.util.stream.Stream;
import javax.annotation.PostConstruct;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import ervu.client.okopf.EsnsiOkopfClient;
import ervu.dao.okopf.OkopfDao;
@ -22,7 +21,6 @@ import org.springframework.context.annotation.DependsOn;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import ru.micord.ervu.exception.JsonParsingException;
import static org.springframework.scheduling.config.ScheduledTaskRegistrar.CRON_DISABLED;
import static org.springframework.util.StringUtils.hasText;
@ -34,7 +32,7 @@ import static org.springframework.util.StringUtils.hasText;
@Service
@DependsOn({"liquibase"})
public class EsnsiOkopfSchedulerServiceImpl implements EsnsiOkopfSchedulerService {
private static final Logger LOGGER = LoggerFactory.getLogger(
private static final Logger logger = LoggerFactory.getLogger(
EsnsiOkopfSchedulerServiceImpl.class);
@Autowired
@ -50,11 +48,11 @@ public class EsnsiOkopfSchedulerServiceImpl implements EsnsiOkopfSchedulerServic
@Transactional
public void init() {
if (!cronLoad.equals(CRON_DISABLED)) {
LOGGER.info("Synchronization with OKOPF enabled");
logger.info("Synchronization with esnsi okopf enabled");
load();
}
else {
LOGGER.info("Synchronization with OKOPF disabled");
logger.info("Synchronization with esnsi okopf disabled");
}
}
@ -62,21 +60,22 @@ public class EsnsiOkopfSchedulerServiceImpl implements EsnsiOkopfSchedulerServic
@SchedulerLock(name = "loadOkopf")
@Transactional
public void load() {
LOGGER.info("Loading okopf file");
String data = esnsiOkopfClient.getJsonOkopFormData();
logger.info("Loading okopf file");
try {
String data = esnsiOkopfClient.getJsonOkopFormData();
if (hasText(data)) {
logger.info("Parsing from json file to okopf model");
OkopfOrgModel orgModel = mapper.readValue(data, OkopfOrgModel.class);
int currentVersion = mapper.readTree(data).findValue("version").asInt();
List<OkopfModel> okopfRecords = mapToOkopfRecords(orgModel.getData(), currentVersion);
logger.info("Finished parsing from json file to okopf model");
logger.info("Loaded {} okopf records with version {}. Beginning to save okopf data", okopfRecords.size(), currentVersion);
okopfDao.saveOrUpdate(okopfRecords);
logger.info("Successfully saved okopf data");
}
}
catch (JsonProcessingException e) {
throw new JsonParsingException(
"Failed to process the JSON response from the esnsi okopf client. Invalid or malformed JSON.",
e
);
catch (Exception e) {
logger.error("Failed to load okopf data", e);
}
}

View file

@ -786,7 +786,7 @@ JBPM использует 3 корневых категории логирова
- `ESNSI_OKOPF_CRON_LOAD` - настройка, которая указывет расписание для загрузки справочника окопф и
сохранение данных по справкам в БД
- `ESNSI_OKOPF_RETRY_DELAY_LOAD` - настройка, которая указывет на повторную попытку загрузить
справочник окопф с задержкой. По умолчанию задержка по времени 1000 ms
справочник окопф с задержкой. По умолчанию задержка по времени 30000 ms
- `ESNSI_OKOPF_RETRY_MAX_ATTEMPTS_LOAD` - настройка, которая указывет на максимальное кол-во попыток
повторно загрузить справочник окопф. По умолчанию 3 попытки

View file

@ -48,7 +48,7 @@ ERVU_KAFKA_EXCERPT_REQUEST_TOPIC=ervu.lkrp.excerpt.request
ESNSI_OKOPF_URL=https://esnsi.gosuslugi.ru/rest/ext/v1/classifiers/16271/file?extension=JSON&encoding=UTF_8
ESNSI_OKOPF_CRON_LOAD=0 0 */1 * * *
ESNSI_OKOPF_RETRY_MAX_ATTEMPTS_LOAD=3
ESNSI_OKOPF_RETRY_DELAY_LOAD=1000
ESNSI_OKOPF_RETRY_DELAY_LOAD=30000
ERVU_FILE_UPLOAD_MAX_FILE_SIZE=5242880
ERVU_FILE_UPLOAD_MAX_REQUEST_SIZE=6291456

View file

@ -85,7 +85,7 @@
<property name="ervu.kafka.password" value="Blfi9d2OFG"/>
<property name="esnsi.okopf.cron.load" value="0 0 */1 * * *"/>
<property name="esnsi.okopf.url" value="https://esnsi.gosuslugi.ru/rest/ext/v1/classifiers/16271/file?extension=JSON&amp;encoding=UTF_8"/>
<property name="esnsi.okop.retry.delay.load" value="1000"/>
<property name="esnsi.okop.retry.delay.load" value="30000"/>
<property name="esnsi.okopf.retry.max.attempts.load" value="3"/>
<property name="ervu.kafka.journal.request.topic" value="ervu.organization.journal.request"/>
<property name="ervu.kafka.journal.reply.topic" value="ervu.organization.journal.response"/>