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);
    }
}