diff --git a/clearing-parent/xml-exporter/src/main/java/ru/spcex/clearing/xml/exporter/logic/data/enums/FilenameTemplate.java b/clearing-parent/xml-exporter/src/main/java/ru/spcex/clearing/xml/exporter/logic/data/enums/FilenameTemplate.java index 0e103518c..b8ab7b904 100644 --- a/clearing-parent/xml-exporter/src/main/java/ru/spcex/clearing/xml/exporter/logic/data/enums/FilenameTemplate.java +++ b/clearing-parent/xml-exporter/src/main/java/ru/spcex/clearing/xml/exporter/logic/data/enums/FilenameTemplate.java @@ -4,16 +4,15 @@ import java.io.File; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.util.Collection; import java.util.List; import java.util.Locale; +import java.util.concurrent.atomic.AtomicInteger; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.integration.sftp.session.SftpFileInfo; import ru.spcex.clearing.xml.exporter.logic.data.ResultContainer; import static ru.spcex.clearing.xml.exporter.logic.stages.PrepareXMLFile.outDir; -import ru.spcex.platform.classes.base.SpcexObjectBase; -import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.utils.time.TimeUtil; @@ -42,15 +41,15 @@ public enum FilenameTemplate { } @Override - public String getFileName(ResultContainer resultContainer, ImdgProviderThreadSafeWrapper imdgPr) { - Imdg imdg = imdgPr.getImdg(resultContainer.getTableForExport().getHazelcastMapName(), SpcexObjectBase.class); - ImdgPredicateBuilder pb = imdg.predicateBuilder(); - Collection sdfs = imdg.getCollectionObjectsByPredicate( - pb.greatEqual("generationTime", TimeUtil.localDateToInstant(LocalDate.now())) - ); + public ImdgPredicate counterPredicate(ImdgPredicateBuilder pb) { + return pb.greatEqual("generationTime", TimeUtil.localDateToInstant(LocalDate.now())); + } + + @Override + public String getFileName(ResultContainer resultContainer, AtomicInteger counter) { return appendSection(resultContainer) .append(dateTime(resultContainer)) - .append("_").append(sdfs.size() + 1) + .append("_").append(counter.incrementAndGet()) .append(".XML").toString(); } }, @@ -151,10 +150,14 @@ public enum FilenameTemplate { return null; } - public String getFileName(ResultContainer resultContainer, ImdgProviderThreadSafeWrapper provider) { + public String getFileName(ResultContainer resultContainer, AtomicInteger provider) { return null; } + public ImdgPredicate counterPredicate(ImdgPredicateBuilder pb) { + return pb.alwaysTrue(); + } + public boolean needSftpFiles() { return true; } diff --git a/clearing-parent/xml-exporter/src/main/java/ru/spcex/clearing/xml/exporter/logic/data/enums/ImdgProviderThreadSafeWrapper.java b/clearing-parent/xml-exporter/src/main/java/ru/spcex/clearing/xml/exporter/logic/data/enums/ImdgProviderThreadSafeWrapper.java deleted file mode 100644 index f3da87c08..000000000 --- a/clearing-parent/xml-exporter/src/main/java/ru/spcex/clearing/xml/exporter/logic/data/enums/ImdgProviderThreadSafeWrapper.java +++ /dev/null @@ -1,20 +0,0 @@ -package ru.spcex.clearing.xml.exporter.logic.data.enums; - -import java.util.concurrent.ConcurrentHashMap; -import ru.spcex.platform.classes.base.SpcexObjectBase; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; - -public final class ImdgProviderThreadSafeWrapper { - private final ConcurrentHashMap> cash = new ConcurrentHashMap<>(); - private final ImdgProvider imdgProvider; - - public ImdgProviderThreadSafeWrapper(ImdgProvider imdgProvider) { - this.imdgProvider = imdgProvider; - } - - public Imdg getImdg(String mapName, Class clazz) { - return (Imdg) - cash.computeIfAbsent(mapName, (k) -> imdgProvider.getImdg(k, clazz)); - } -} diff --git a/clearing-parent/xml-exporter/src/main/java/ru/spcex/clearing/xml/exporter/logic/stages/PrepareXMLFile.java b/clearing-parent/xml-exporter/src/main/java/ru/spcex/clearing/xml/exporter/logic/stages/PrepareXMLFile.java index 8812fab6f..f80e1055d 100644 --- a/clearing-parent/xml-exporter/src/main/java/ru/spcex/clearing/xml/exporter/logic/stages/PrepareXMLFile.java +++ b/clearing-parent/xml-exporter/src/main/java/ru/spcex/clearing/xml/exporter/logic/stages/PrepareXMLFile.java @@ -7,10 +7,13 @@ import java.nio.file.Path; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; +import java.util.Collection; import java.util.EnumMap; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; @@ -20,10 +23,12 @@ import ru.spcex.clearing.xml.exporter.config.SFTPConfig; import ru.spcex.clearing.xml.exporter.config.settings.ExportXMLServiceSettings; import ru.spcex.clearing.xml.exporter.logic.data.ResultContainer; import ru.spcex.clearing.xml.exporter.logic.data.enums.FilenameTemplate; -import ru.spcex.clearing.xml.exporter.logic.data.enums.ImdgProviderThreadSafeWrapper; import ru.spcex.clearing.xml.exporter.logic.data.enums.StageResult; import ru.spcex.clearing.xml.exporter.logic.data.enums.Table; +import ru.spcex.platform.classes.base.SpcexObjectBase; +import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; import ru.spcex.platform.utils.log.ExceptionUtils; @Component @@ -34,14 +39,15 @@ public class PrepareXMLFile implements InitializingBean { private final ExportXMLServiceSettings settings; public static String outDir; private final SFTPConfig.XmlGateway gateway; - private final ImdgProviderThreadSafeWrapper imdgProviderWrapper; + private final ImdgProvider imdgProvider; + private final Map counters = new HashMap<>(); public PrepareXMLFile(ImdgProvider imdgProvider, ExportXMLServiceSettings settings, SFTPConfig.XmlGateway gateway) { this.settings = settings; this.gateway = gateway; - this.imdgProviderWrapper = new ImdgProviderThreadSafeWrapper(imdgProvider); + this.imdgProvider = imdgProvider; } public StageResult process(ResultContainer resultContainer) { @@ -77,7 +83,8 @@ public class PrepareXMLFile implements InitializingBean { if (template.needSftpFiles()) { xmlFile = new File(template.getFileName(resultContainer, files)); } else { - xmlFile = new File(template.getFileName(resultContainer, imdgProviderWrapper)); + AtomicInteger counter = getOrInitCounter(table, template); + xmlFile = new File(template.getFileName(resultContainer, counter)); } if (sftpConnectionError) { String errorFileName = "error_%s_%s".formatted(LocalDateTime.now().format(FORMATTER), xmlFile.getName()); @@ -100,6 +107,17 @@ public class PrepareXMLFile implements InitializingBean { return StageResult.OK; } + private AtomicInteger getOrInitCounter(Table table, FilenameTemplate template) { + return counters.computeIfAbsent(table, k -> { + imdgProvider.waitAvailable(); + Imdg imdg = imdgProvider.getImdg(k.getHazelcastMapName(), SpcexObjectBase.class); + ImdgPredicate counterPredicate = template.counterPredicate(imdg.predicateBuilder()); + Collection items = imdg.getCollectionObjectsByPredicate(counterPredicate); + return new AtomicInteger(items.size()); + } + ); + } + @Override public void afterPropertiesSet() throws Exception {