From 4c0dd1739b89a1664b30f42ae90dc7e60ca74b08 Mon Sep 17 00:00:00 2001 From: ialbert Date: Fri, 2 Aug 2024 17:48:16 +0300 Subject: [PATCH] imdg eviction policy for ExecutionCurrencyHistoryMapStore/RegistryHistoryMapStore --- .../clearing/imdg/base/AutoconfiguredMap.java | 4 ++ .../ExecutionCurrencyHistoryMapStore.java | 14 +++++ .../RegistryHistoryMapStore.java | 29 ++++++++-- .../clearing/imdg/config/PoolMapConfigs.java | 27 +++++++--- .../config/element/ImdgHzEvictionConfig.java | 53 +++++++++++++++++++ 5 files changed, 116 insertions(+), 11 deletions(-) create mode 100644 clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/element/ImdgHzEvictionConfig.java diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/base/AutoconfiguredMap.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/base/AutoconfiguredMap.java index 66e4fb924..6264edb11 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/base/AutoconfiguredMap.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/base/AutoconfiguredMap.java @@ -1,7 +1,9 @@ package ru.spcex.clearing.imdg.base; +import java.util.Optional; import com.hazelcast.config.MapIndexConfig; import com.hazelcast.core.MapLoader; +import ru.spcex.clearing.imdg.config.element.ImdgHzEvictionConfig; public interface AutoconfiguredMap extends MapLoader { MapIndexConfig[] emptyIndexes = new MapIndexConfig[0]; @@ -12,6 +14,8 @@ public interface AutoconfiguredMap extends MapLoader { */ String getMapName(); + default Optional evictionConfig() {return Optional.empty();} + /** * Список индексируемых полей, для быстрого поиска * @return diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessevent/ExecutionCurrencyHistoryMapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessevent/ExecutionCurrencyHistoryMapStore.java index cb1f2439a..429756764 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessevent/ExecutionCurrencyHistoryMapStore.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessevent/ExecutionCurrencyHistoryMapStore.java @@ -1,11 +1,15 @@ package ru.spcex.clearing.imdg.businessevent; +import java.util.Optional; +import com.hazelcast.config.EvictionConfig; +import com.hazelcast.config.MaxSizeConfig; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Component; import ru.clearing.classes.statics.data.execution.ExecutionCurrency; import ru.clearing.classes.statics.data.execution.ExecutionCurrencyHistory; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.base.TemplateEventMapStore; +import ru.spcex.clearing.imdg.config.element.ImdgHzEvictionConfig; import ru.spcex.platform.utils.time.TimeUtil; @Component @@ -15,6 +19,16 @@ public class ExecutionCurrencyHistoryMapStore extends TemplateEventMapStore evictionConfig() { + ImdgHzEvictionConfig evctCfg = new ImdgHzEvictionConfig(); + evctCfg.setSize(5000); + evctCfg.setMaxSizePolicy(MaxSizeConfig.MaxSizePolicy.PER_NODE); + evctCfg.setEvictionPolicy(EvictionConfig.DEFAULT_EVICTION_POLICY); + evctCfg.setTimeToLiveSeconds(1800); + return Optional.of(evctCfg); + } + @Override public String getMapName() { return IMDGDistributedNames.Map_ExecutionCurrencyHistory; diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessevent/RegistryHistoryMapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessevent/RegistryHistoryMapStore.java index 79a3cd832..1640ccf38 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessevent/RegistryHistoryMapStore.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessevent/RegistryHistoryMapStore.java @@ -1,5 +1,18 @@ package ru.spcex.clearing.imdg.businessevent; +import java.math.BigDecimal; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import com.hazelcast.config.EvictionConfig; +import com.hazelcast.config.MaxSizeConfig; import org.springframework.dao.support.DataAccessUtils; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Component; @@ -7,13 +20,9 @@ import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.RegistryHistory; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.base.TemplateEventMapStore; +import ru.spcex.clearing.imdg.config.element.ImdgHzEvictionConfig; import ru.spcex.platform.utils.time.TimeUtil; -import java.math.BigDecimal; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.*; - @Component public class RegistryHistoryMapStore extends TemplateEventMapStore { @@ -21,6 +30,16 @@ public class RegistryHistoryMapStore extends TemplateEventMapStore evictionConfig() { + ImdgHzEvictionConfig evctCfg = new ImdgHzEvictionConfig(); + evctCfg.setSize(5000); + evctCfg.setMaxSizePolicy(MaxSizeConfig.MaxSizePolicy.PER_NODE); + evctCfg.setEvictionPolicy(EvictionConfig.DEFAULT_EVICTION_POLICY); + evctCfg.setTimeToLiveSeconds(1800); + return Optional.of(evctCfg); + } + @Override public String getTableName() { return "REGISTRY_HISTORY"; diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/PoolMapConfigs.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/PoolMapConfigs.java index 69e87faf5..8a47a411c 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/PoolMapConfigs.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/PoolMapConfigs.java @@ -1,6 +1,16 @@ package ru.spcex.clearing.imdg.config; -import com.hazelcast.config.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import com.hazelcast.config.InMemoryFormat; +import com.hazelcast.config.MapConfig; +import com.hazelcast.config.MapIndexConfig; +import com.hazelcast.config.MapStoreConfig; +import com.hazelcast.config.MaxSizeConfig; +import com.hazelcast.config.NearCacheConfig; +import com.hazelcast.config.ScheduledExecutorConfig; import com.hazelcast.core.MapLoader; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -15,11 +25,6 @@ import ru.spcex.clearing.imdg.businessevent.CompanyHistoryMapStore; import ru.spcex.clearing.imdg.businessobject.CompanyMapStore; import ru.spcex.clearing.imdg.config.element.ImdgSettings; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; - @Configuration public class PoolMapConfigs implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); @@ -112,6 +117,16 @@ public class PoolMapConfigs implements InitializingBean { } existMapStores.add(mapStore.getMapName()); // IMDGDistributedNames MapConfig mapCfg = makeDefaultMapConfig(mapStore.getMapName(), mapStore); + mapStore.evictionConfig().ifPresent(evctCfg -> { + log.debug("eviction config is enabled for {}: {}", mapStore.getMapName(), evctCfg); + MaxSizeConfig mxc = new MaxSizeConfig(); + mxc.setSize(evctCfg.getSize()); + mxc.setMaxSizePolicy(evctCfg.getMaxSizePolicy()); + mapCfg.setMaxSizeConfig(mxc); + mapCfg.setEvictionPolicy(evctCfg.getEvictionPolicy()); + mapCfg.setTimeToLiveSeconds(evctCfg.getTimeToLiveSeconds()); + }); + if (mapStore.getIndexes().length > 0) { if (log.isTraceEnabled()) { log.trace("Create indexing filed on {}: {}", mapStore.getMapName(), Arrays.toString(mapStore.getIndexes())); diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/element/ImdgHzEvictionConfig.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/element/ImdgHzEvictionConfig.java new file mode 100644 index 000000000..3a539bc3e --- /dev/null +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/element/ImdgHzEvictionConfig.java @@ -0,0 +1,53 @@ +package ru.spcex.clearing.imdg.config.element; + +import com.hazelcast.config.EvictionPolicy; +import com.hazelcast.config.MaxSizeConfig; + +public class ImdgHzEvictionConfig { + private int size; + private MaxSizeConfig.MaxSizePolicy maxSizePolicy; + private EvictionPolicy evictionPolicy; + private int timeToLiveSeconds; + + @Override + public String toString() { + return "ImdgHzEvictionConfig{" + + "size=" + size + + ", maxSizePolicy=" + maxSizePolicy + + ", evictionPolicy=" + evictionPolicy + + ", timeToLiveSeconds=" + timeToLiveSeconds + + '}'; + } + + public int getSize() { + return size; + } + + public void setSize(int size) { + this.size = size; + } + + public MaxSizeConfig.MaxSizePolicy getMaxSizePolicy() { + return maxSizePolicy; + } + + public void setMaxSizePolicy(MaxSizeConfig.MaxSizePolicy maxSizePolicy) { + this.maxSizePolicy = maxSizePolicy; + } + + public EvictionPolicy getEvictionPolicy() { + return evictionPolicy; + } + + public void setEvictionPolicy(EvictionPolicy evictionPolicy) { + this.evictionPolicy = evictionPolicy; + } + + public int getTimeToLiveSeconds() { + return timeToLiveSeconds; + } + + public void setTimeToLiveSeconds(int timeToLiveSeconds) { + this.timeToLiveSeconds = timeToLiveSeconds; + } +}