HazelcastConfiguration.java
package com.tradecloud.config;
import com.hazelcast.config.*;
import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.spring.cache.HazelcastCacheManager;
import com.tradecloud.domain.base.utils.LocaleDateRangeSerializer;
import org.apache.log4j.Logger;
import org.springframework.cache.CacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
@Configuration
public class HazelcastConfiguration {
private static final Logger log = Logger.getLogger(HazelcastConfiguration.class);
@Bean(destroyMethod = "shutdown")
@Primary
public HazelcastInstance hazelcastInstance() {
Config config = new Config();
config.setClusterName("tradecloud-shared-cluster");
config.setInstanceName("tradecloud-hz-instance");
config.setProperty("hazelcast.logging.type", "log4j");
config.getSerializationConfig().
addDataSerializableFactory(LocaleDateRangeSerializer.FACTORY_ID, new LocaleDateRangeSerializer());
// Networking config (customize as needed)
config.getNetworkConfig()
.setPort(5701)
.setPortAutoIncrement(true)
.getJoin()
.getMulticastConfig()
.setEnabled(false);
config.getNetworkConfig().getJoin()
.getTcpIpConfig()
.setEnabled(true)
.addMember(System.getenv("core_ip") != null ? System.getenv("core_ip") : "localhost");
if (isWorkerInstance()||isScriptInstance()) {
config.setLiteMember(true);
}
// Specific map configs (customize eviction/size for each cache type)
config.addMapConfig(mapConfig("*_ui", 10000));
config.addMapConfig(mapConfig("*_userLookup", 10000));
config.addMapConfig(mapConfig("*_staticData", 10000));
config.addMapConfig(mapConfig("*_organisational", 10000));
config.addMapConfig(mapConfig("*_organisationalUnitSupplier", 10000));
config.addMapConfig(mapConfig("*_exportParty", 10000));
config.addMapConfig(mapConfig("*_integrationCache", 10000));
config.addMapConfig(mapConfig("*_confirmingFeeRateCache", 10000));
config.addMapConfig(mapConfig("*_agentRateCache", 10000));
config.addMapConfig(mapConfig("*_AgentByRateTableCache", 10000));
config.addMapConfig(mapConfig("*_clearingRateCache", 10000));
config.addMapConfig(mapConfig("*_financeRateCache", 10000));
config.addMapConfig(mapConfig("*_forwardingRateCache", 10000));
config.addMapConfig(mapConfig("*_freightRateCache", 10000));
config.addMapConfig(mapConfig("*_internalProvisionRateCache", 10000));
config.addMapConfig(mapConfig("*_costFormulaCache", 10000));
config.addMapConfig(mapConfig("*_effectiveDatesConfigCache", 100));
config.addMapConfig(mapConfig("*_rateLookupPriorityCache", 1000));
config.addMapConfig(mapConfig("*_clientConfigCache", 1000));
config.addMapConfig(mapConfig("*_tariffSearchCache", 100));
config.addMapConfig(mapConfig("*_tradeAgreementSearchCache", 100));
config.addMapConfig(mapConfig("*_usermap", 100));
config.addMapConfig(mapConfig("*_countryGroupSearchCache", 100));
config.addMapConfig(mapConfig("*_costlineTemplateRateCache", 100));
config.addMapConfig(mapConfig("*_tariffCache", 1000));
config.addMapConfig(mapConfig("*_costGroupforexGroupCache", 200));
config.addMapConfig(mapConfig("*_maturityDateCache", 200));
config.addMapConfig(mapConfig("*_exportRateCache", 10000));
config.addMapConfig(mapConfig("*_exportInvoiceCache", 10000));
config.addMapConfig(mapConfig("*_productCache", 1000));
config.addMapConfig(mapConfig("*_reportConfig", 100));
config.addMapConfig(mapConfig("*_dmstypes", 100));
// config.addMapConfig(mapConfig*_("shared-cache", 1000)); // Your shared default
HazelcastInstance instance = Hazelcast.newHazelcastInstance(config);
log.info("Started shared Hazelcast cluster: " + instance.getConfig().getClusterName());
return instance;
}
private boolean isWorkerInstance() {
boolean isWorker = "WORKER".equalsIgnoreCase(System.getenv("hazelcast_role"));
if (isWorker) {
log.info("HAZELCAST ROLE: WORKER INSTANCE RUNNING");
}
return isWorker;
}
private boolean isScriptInstance() {
boolean isScript = Boolean.getBoolean("scriptInstance");
if (isScript) {
log.info("INSTANCE TYPE: SCRIPT INSTANCE RUNNING");
}
return isScript;
}
private MapConfig mapConfig(String name, int maxSize) {
MapConfig mapConfig = new MapConfig(name);
EntryListenerConfig entryListenerConfig = new EntryListenerConfig();
entryListenerConfig.setImplementation(new MyEvictionListener());
entryListenerConfig.setLocal(false); // Set to true if you only want to hear about local partition events
mapConfig.addEntryListenerConfig(entryListenerConfig);
mapConfig.setBackupCount(0)
.setTimeToLiveSeconds(0)
.setMaxIdleSeconds(0)
.setReadBackupData(true)
.setStatisticsEnabled(true)
.setPerEntryStatsEnabled(true)
.setMergePolicyConfig(new MergePolicyConfig("com.hazelcast.spi.merge.PassThroughMergePolicy", MergePolicyConfig.DEFAULT_BATCH_SIZE))
.getEvictionConfig()
.setEvictionPolicy(EvictionPolicy.LFU)
.setSize(maxSize);
// .setMaxSizePolicy(MaxSizePolicy.USED_HEAP_PERCENTAGE)
// .setSize(60);
log.info("Map: " + name + " | TTL: " + mapConfig.getTimeToLiveSeconds() + " seconds");
return mapConfig;
}
@Bean
public CacheManager cacheManager(HazelcastInstance hazelcastInstance) {
return new HazelcastCacheManager(hazelcastInstance);
}
}