ialbert 2026-06-24 16:04:05 +03:00
parent 95758276ca
commit 5286104e74
3 changed files with 36 additions and 35 deletions

View file

@ -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<SpcexObjectBase> imdg = imdgPr.getImdg(resultContainer.getTableForExport().getHazelcastMapName(), SpcexObjectBase.class);
ImdgPredicateBuilder pb = imdg.predicateBuilder();
Collection<SpcexObjectBase> 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;
}

View file

@ -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<String, Imdg<?>> cash = new ConcurrentHashMap<>();
private final ImdgProvider imdgProvider;
public ImdgProviderThreadSafeWrapper(ImdgProvider imdgProvider) {
this.imdgProvider = imdgProvider;
}
public <T extends SpcexObjectBase> Imdg<T> getImdg(String mapName, Class<T> clazz) {
return (Imdg<T>)
cash.computeIfAbsent(mapName, (k) -> imdgProvider.getImdg(k, clazz));
}
}

View file

@ -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<Table, AtomicInteger> 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<SpcexObjectBase> imdg = imdgProvider.getImdg(k.getHazelcastMapName(), SpcexObjectBase.class);
ImdgPredicate counterPredicate = template.counterPredicate(imdg.predicateBuilder());
Collection<SpcexObjectBase> items = imdg.getCollectionObjectsByPredicate(counterPredicate);
return new AtomicInteger(items.size());
}
);
}
@Override
public void afterPropertiesSet() throws Exception {