package nearcache; import com.hazelcast.config.NearCacheConfig; import java.util.concurrent.TimeUnit; import static com.hazelcast.examples.helper.CommonUtils.sleepSeconds; /** * You have to set your Hazelcast Enterprise license key to make this code sample work. * Please have a look at {@link com.hazelcast.examples.helper.LicenseUtils} for details. */ public class ClientHiDensityNearCacheUsage extends ClientHiDensityNearCacheUsageSupport { private static final int RECORD_COUNT = 1000; private static final boolean VERBOSE = Boolean.getBoolean("com.hazelcast.examples.hdjcache.hdnearcache.verbose"); private void run() { NearCacheConfig nearCacheConfig = createNearCacheConfig() .setInvalidateOnChange(true); HiDensityNearCacheSupportContext<Integer, String> clientCacheContext1 = createHiDensityCacheWithHiDensityNearCache(nearCacheConfig); HiDensityNearCacheSupportContext<Integer, String> clientCacheContext2 = createHiDensityCacheWithHiDensityNearCache(nearCacheConfig); // put records to cache through client-1 putRecordsToCacheOnClient1(clientCacheContext1, clientCacheContext2); // get records from cache through client-2 getRecordsFromCacheOnClient2(clientCacheContext1, clientCacheContext2); // get records from Near Cache on client-2 getRecordsFromNearCacheOnClient2(clientCacheContext1, clientCacheContext2); // update records at cache through client-1 updateRecordsInCacheOnClient1(clientCacheContext1, clientCacheContext2); // wait a little for invalidation events sleepSeconds(5); // get invalidated records from Near Cache on client-2 getInvalidatedRecordsFromNearCacheOnClient2(clientCacheContext1, clientCacheContext2); shutdown(); } private void putRecordsToCacheOnClient1(HiDensityNearCacheSupportContext<Integer, String> clientCacheContext1, HiDensityNearCacheSupportContext<Integer, String> clientCacheContext2) { for (int i = 0; i < RECORD_COUNT; i++) { String value = generateValueFromKey(i); clientCacheContext1.cache.put(i, value); if (VERBOSE) { System.out.println("Put key=" + i + ", value=" + value + " to Hi-Density cache through client-1"); } } System.out.println(RECORD_COUNT + " records have been put to Hi-Density cache through client-1"); System.out.println("Memory usage on client-1: " + clientCacheContext1.memoryManager.getMemoryStats()); System.out.println("Memory usage on client-2: " + clientCacheContext2.memoryManager.getMemoryStats()); } private void getRecordsFromCacheOnClient2(HiDensityNearCacheSupportContext<Integer, String> clientCacheContext1, HiDensityNearCacheSupportContext<Integer, String> clientCacheContext2) { long started = System.nanoTime(); for (int i = 0; i < RECORD_COUNT; i++) { // these get() calls populate the Near Cache, so at the next calls, // the values will be taken from local Near Cache without any remote access String actualValue = clientCacheContext2.cache.get(i); String expectedValue = generateValueFromKey(i); assert actualValue.equals(expectedValue) : "Taken value from Hi-Density cache must be " + expectedValue + " but it is " + actualValue; if (VERBOSE) { System.out.println("Get key=" + i + ", value=" + actualValue + " from Hi-Density cache through client-2"); } } long elapsed = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - started); System.out.println("Get records from Hi-Density cache finished in " + elapsed + " milliseconds"); System.out.println("Memory usage on client-1: " + clientCacheContext1.memoryManager.getMemoryStats()); System.out.println("Memory usage on client-2: " + clientCacheContext2.memoryManager.getMemoryStats()); } private void getRecordsFromNearCacheOnClient2(HiDensityNearCacheSupportContext<Integer, String> clientCacheContext1, HiDensityNearCacheSupportContext<Integer, String> clientCacheContext2) { long started = System.nanoTime(); for (int i = 0; i < RECORD_COUNT; i++) { // since this record has been put to Near Cache before, // it is taken from the local Near Cache without any remote access String actualValue = clientCacheContext2.cache.get(i); String expectedValue = generateValueFromKey(i); assert actualValue.equals(expectedValue) : "Taken value from cache must be " + expectedValue + " but it is " + actualValue; if (VERBOSE) { System.out.println("Get key=" + i + ", value=" + actualValue + " from Hi-Density Near Cache on client-2"); } } long elapsed = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - started); System.out.println("Get records from Near Cache finished in " + elapsed + " milliseconds"); System.out.println("Memory usage on client-1: " + clientCacheContext1.memoryManager.getMemoryStats()); System.out.println("Memory usage on client-2: " + clientCacheContext2.memoryManager.getMemoryStats()); } private void updateRecordsInCacheOnClient1(HiDensityNearCacheSupportContext<Integer, String> clientCacheContext1, HiDensityNearCacheSupportContext<Integer, String> clientCacheContext2) { for (int i = 0; i < RECORD_COUNT; i++) { String value = generateValueFromKey(i * i); clientCacheContext1.cache.put(i, value); if (VERBOSE) { System.out.println("Update key=" + i + ", value=" + value + " to Hi-Density cache through client-1"); } } System.out.println(RECORD_COUNT + " records have been updated in Hi-Density cache through client-1"); System.out.println("Memory usage on client-1: " + clientCacheContext1.memoryManager.getMemoryStats()); System.out.println("Memory usage on client-2: " + clientCacheContext2.memoryManager.getMemoryStats()); } private void getInvalidatedRecordsFromNearCacheOnClient2( HiDensityNearCacheSupportContext<Integer, String> clientCacheContext1, HiDensityNearCacheSupportContext<Integer, String> clientCacheContext2) { long started = System.nanoTime(); for (int i = 0; i < RECORD_COUNT; i++) { // these record have been invalidated at Near Cache on client-2, // because client-1 has updated the records and invalidation events are sent to client-2, // so the records have been taken from the remote cache (not the local Near Cache) through client-2 String actualValue = clientCacheContext2.cache.get(i); String expectedValue = generateValueFromKey(i); try { assert actualValue.equals(expectedValue) : "Taken value from cache should be " + expectedValue + " but it is " + actualValue; } catch (AssertionError assertionError) { System.out.println("Seems that invalidation event for record with key " + i + " has not reached yet"); } if (VERBOSE) { System.out.println("Get key=" + i + ", value=" + actualValue + " from cache through client-2 after invalidation"); } } long elapsed = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - started); System.out.println("Get invalidated records from Near Cache finished in " + elapsed + " milliseconds"); System.out.println("Memory usage on client-1: " + clientCacheContext1.memoryManager.getMemoryStats()); System.out.println("Memory usage on client-2: " + clientCacheContext2.memoryManager.getMemoryStats()); } public static void main(String[] args) { ClientHiDensityNearCacheUsage clientHiDensityNearCacheUsage = new ClientHiDensityNearCacheUsage(); clientHiDensityNearCacheUsage.run(); } }