package com.hazelcast.examples.nearcache;
import com.hazelcast.cache.ICache;
import com.hazelcast.client.HazelcastClient;
import com.hazelcast.client.cache.impl.HazelcastClientCacheManager;
import com.hazelcast.client.cache.impl.HazelcastClientCachingProvider;
import com.hazelcast.client.config.ClientConfig;
import com.hazelcast.client.impl.HazelcastClientProxy;
import com.hazelcast.config.CacheConfig;
import com.hazelcast.config.Config;
import com.hazelcast.config.EvictionConfig;
import com.hazelcast.config.EvictionPolicy;
import com.hazelcast.config.InMemoryFormat;
import com.hazelcast.config.JoinConfig;
import com.hazelcast.config.NearCacheConfig;
import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.examples.Article;
import com.hazelcast.internal.nearcache.NearCache;
import com.hazelcast.monitor.NearCacheStats;
import javax.cache.spi.CachingProvider;
import java.util.LinkedList;
import java.util.List;
import static com.hazelcast.examples.helper.CommonUtils.sleepSeconds;
import static com.hazelcast.spi.properties.GroupProperty.CACHE_INVALIDATION_MESSAGE_BATCH_FREQUENCY_SECONDS;
import static java.lang.Integer.parseInt;
@SuppressWarnings({"checkstyle:methodcount", "unused"})
public abstract class ClientNearCacheUsageSupport {
protected static final String DEFAULT_CACHE_NAME = "ClientCache";
private static final int EXPIRATION_TASK_DELAY_SECONDS = 2 * NearCache.DEFAULT_EXPIRATION_TASK_DELAY_IN_SECONDS;
private static final int INVALIDATION_DELAY_SECONDS
= 2 * parseInt(CACHE_INVALIDATION_MESSAGE_BATCH_FREQUENCY_SECONDS.getDefaultValue());
protected final List<HazelcastInstance> clients = new LinkedList<HazelcastInstance>();
private final InMemoryFormat inMemoryFormat;
private final HazelcastInstance serverInstance;
protected ClientNearCacheUsageSupport() {
inMemoryFormat = InMemoryFormat.BINARY;
serverInstance = Hazelcast.newHazelcastInstance(createConfig());
}
protected ClientNearCacheUsageSupport(InMemoryFormat defaultInMemoryFormat) {
inMemoryFormat = defaultInMemoryFormat;
serverInstance = Hazelcast.newHazelcastInstance(createConfig());
}
protected void shutdown() {
for (HazelcastInstance client : clients) {
client.shutdown();
}
clients.clear();
if (serverInstance != null) {
serverInstance.shutdown();
}
}
protected HazelcastInstance getServerInstance() {
return serverInstance;
}
protected Config createConfig() {
Config config = new Config();
JoinConfig joinConfig = config.getNetworkConfig().getJoin();
joinConfig.getAwsConfig().setEnabled(false);
joinConfig.getMulticastConfig().setEnabled(false);
joinConfig.getTcpIpConfig().setEnabled(false);
return config;
}
protected ClientConfig createClientConfig() {
ClientConfig clientConfig = new ClientConfig();
clientConfig.getNetworkConfig().addAddress("127.0.0.1");
return clientConfig;
}
protected <K, V> CacheConfig<K, V> createCacheConfig() {
return createCacheConfig(DEFAULT_CACHE_NAME, inMemoryFormat);
}
protected <K, V> CacheConfig<K, V> createCacheConfig(String cacheName) {
return createCacheConfig(cacheName, inMemoryFormat);
}
protected <K, V> CacheConfig<K, V> createCacheConfig(InMemoryFormat inMemoryFormat) {
return createCacheConfig(DEFAULT_CACHE_NAME, inMemoryFormat);
}
protected <K, V> CacheConfig<K, V> createCacheConfig(String cacheName, InMemoryFormat inMemoryFormat) {
return new CacheConfig<K, V>()
.setName(DEFAULT_CACHE_NAME)
.setInMemoryFormat(inMemoryFormat);
}
protected EvictionConfig createEvictionConfigWithEntryCountPolicy(int size) {
return new EvictionConfig()
.setEvictionPolicy(EvictionPolicy.LRU)
.setMaximumSizePolicy(EvictionConfig.MaxSizePolicy.ENTRY_COUNT)
.setSize(size);
}
protected NearCacheConfig createNearCacheConfig() {
return createNearCacheConfig(DEFAULT_CACHE_NAME, inMemoryFormat);
}
protected NearCacheConfig createNearCacheConfig(String cacheName) {
return createNearCacheConfig(cacheName, inMemoryFormat);
}
protected NearCacheConfig createNearCacheConfig(InMemoryFormat inMemoryFormat) {
return createNearCacheConfig(DEFAULT_CACHE_NAME, inMemoryFormat);
}
protected NearCacheConfig createNearCacheConfig(String cacheName, InMemoryFormat inMemoryFormat) {
return new NearCacheConfig()
.setName(DEFAULT_CACHE_NAME)
.setInMemoryFormat(inMemoryFormat);
}
protected <K, V> ICache<K, V> createCacheWithNearCache() {
return createCacheWithNearCache(DEFAULT_CACHE_NAME, createNearCacheConfig());
}
protected <K, V> ICache<K, V> createCacheWithNearCache(String cacheName) {
return createCacheWithNearCache(cacheName, createNearCacheConfig(cacheName));
}
protected <K, V> ICache<K, V> createCacheWithNearCache(InMemoryFormat inMemoryFormat) {
return createCacheWithNearCache(DEFAULT_CACHE_NAME, createNearCacheConfig(inMemoryFormat));
}
protected <K, V> ICache<K, V> createCacheWithNearCache(NearCacheConfig nearCacheConfig) {
return createCacheWithNearCache(DEFAULT_CACHE_NAME, nearCacheConfig);
}
protected <K, V> ICache<K, V> createCacheWithNearCache(String cacheName, NearCacheConfig nearCacheConfig) {
CacheConfig<K, V> cacheConfig = createCacheConfig(nearCacheConfig.getInMemoryFormat());
return createCacheWithNearCache(cacheName, cacheConfig, nearCacheConfig);
}
protected <K, V> ICache<K, V> createCacheWithNearCache(CacheConfig<K, V> cacheConfig, NearCacheConfig nearCacheConfig) {
return createCacheWithNearCache(DEFAULT_CACHE_NAME, cacheConfig, nearCacheConfig);
}
protected <K, V> ICache<K, V> createCacheWithNearCache(String cacheName, CacheConfig<K, V> cacheConfig,
NearCacheConfig nearCacheConfig) {
ClientConfig clientConfig = createClientConfig();
clientConfig.addNearCacheConfig(nearCacheConfig);
HazelcastClientProxy client = (HazelcastClientProxy) HazelcastClient.newHazelcastClient(clientConfig);
CachingProvider provider = HazelcastClientCachingProvider.createCachingProvider(client);
HazelcastClientCacheManager cacheManager = (HazelcastClientCacheManager) provider.getCacheManager();
ICache<K, V> cache = cacheManager.createCache(cacheName, cacheConfig);
clients.add(client);
return cache;
}
protected <K, V> ICache<K, V> getCacheWithNearCache() {
return getCacheWithNearCache(DEFAULT_CACHE_NAME, createNearCacheConfig());
}
protected <K, V> ICache<K, V> getCacheWithNearCache(String cacheName) {
return getCacheWithNearCache(cacheName, createNearCacheConfig(cacheName));
}
protected <K, V> ICache<K, V> getCacheWithNearCache(InMemoryFormat inMemoryFormat) {
return getCacheWithNearCache(DEFAULT_CACHE_NAME, createNearCacheConfig(inMemoryFormat));
}
protected <K, V> ICache<K, V> getCacheWithNearCache(NearCacheConfig nearCacheConfig) {
return getCacheWithNearCache(DEFAULT_CACHE_NAME, nearCacheConfig);
}
protected <K, V> ICache<K, V> getCacheWithNearCache(String cacheName, NearCacheConfig nearCacheConfig) {
ClientConfig clientConfig = createClientConfig();
clientConfig.addNearCacheConfig(nearCacheConfig);
HazelcastClientProxy client = (HazelcastClientProxy) HazelcastClient.newHazelcastClient(clientConfig);
CachingProvider provider = HazelcastClientCachingProvider.createCachingProvider(client);
HazelcastClientCacheManager cacheManager = (HazelcastClientCacheManager) provider.getCacheManager();
ICache<K, V> cache = cacheManager.getCache(cacheName);
clients.add(client);
return cache;
}
protected String generateValueFromKey(Integer key) {
return "Value-" + key;
}
protected static void printNearCacheStats(ICache<Integer, Article> cache) {
NearCacheStats stats = cache.getLocalCacheStatistics().getNearCacheStatistics();
System.out.printf("The Near Cache contains %d entries.%n", stats.getOwnedEntryCount());
System.out.printf("The first article instance was retrieved from the remote instance (Near Cache misses: %d).%n",
stats.getMisses());
System.out.printf(
"The second and third article instance were retrieved from the local Near Cache (Near Cache hits: %d).%n",
stats.getHits());
}
protected static void printNearCacheStats(ICache<?, ?> cache, String message) {
NearCacheStats stats = cache.getLocalCacheStatistics().getNearCacheStatistics();
System.out.printf("%s (%d entries, %d hits, %d misses, %d evictions, %d expirations)%n",
message, stats.getOwnedEntryCount(), stats.getHits(), stats.getMisses(),
stats.getEvictions(), stats.getExpirations());
}
protected static void waitForExpirationTask(int expireTimeoutSeconds) {
sleepSeconds(EXPIRATION_TASK_DELAY_SECONDS + expireTimeoutSeconds);
}
protected static void waitForInvalidationEvents() {
sleepSeconds(INVALIDATION_DELAY_SECONDS);
}
}