BAEL-3459 updated cache2k example and test cases (#8732)
This commit is contained in:
parent
409ebc1a90
commit
a73581fbaf
@ -4,38 +4,33 @@ import java.util.Objects;
|
|||||||
|
|
||||||
import org.cache2k.Cache;
|
import org.cache2k.Cache;
|
||||||
import org.cache2k.Cache2kBuilder;
|
import org.cache2k.Cache2kBuilder;
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
public class ProductHelper {
|
public class ProductHelper {
|
||||||
|
|
||||||
final Logger LOGGER = LoggerFactory.getLogger(ProductHelper.class);
|
|
||||||
|
|
||||||
private Cache<String, Integer> cachedDiscounts;
|
private Cache<String, Integer> cachedDiscounts;
|
||||||
|
|
||||||
|
private int cacheMissCount = 0;
|
||||||
|
|
||||||
public ProductHelper() {
|
public ProductHelper() {
|
||||||
cachedDiscounts = Cache2kBuilder.of(String.class, Integer.class)
|
cachedDiscounts = Cache2kBuilder.of(String.class, Integer.class)
|
||||||
.name("discount")
|
.name("discount")
|
||||||
.eternal(true)
|
.eternal(true)
|
||||||
.entryCapacity(100)
|
.entryCapacity(100)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
initDiscountCache("Sports", 20);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void initDiscountCache(String productType, Integer value) {
|
|
||||||
cachedDiscounts.put(productType, value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Integer getDiscount(String productType) {
|
public Integer getDiscount(String productType) {
|
||||||
Integer discount = cachedDiscounts.get(productType);
|
Integer discount = cachedDiscounts.get(productType);
|
||||||
if (Objects.isNull(discount)) {
|
if (Objects.isNull(discount)) {
|
||||||
LOGGER.info("Discount for {} not found.", productType);
|
cacheMissCount++;
|
||||||
discount = 0;
|
discount = "Sports".equalsIgnoreCase(productType) ? 20 : 10;
|
||||||
} else {
|
cachedDiscounts.put(productType, discount);
|
||||||
LOGGER.info("Discount for {} found.", productType);
|
|
||||||
}
|
}
|
||||||
return discount;
|
return discount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getCacheMissCount() {
|
||||||
|
return cacheMissCount;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package com.baeldung.cache2k;
|
package com.baeldung.cache2k;
|
||||||
|
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import org.cache2k.Cache;
|
import org.cache2k.Cache;
|
||||||
@ -14,28 +13,26 @@ public class ProductHelperUsingLoader {
|
|||||||
|
|
||||||
private Cache<String, Integer> cachedDiscounts;
|
private Cache<String, Integer> cachedDiscounts;
|
||||||
|
|
||||||
|
private int cacheMissCount = 0;
|
||||||
|
|
||||||
public ProductHelperUsingLoader() {
|
public ProductHelperUsingLoader() {
|
||||||
cachedDiscounts = Cache2kBuilder.of(String.class, Integer.class)
|
cachedDiscounts = Cache2kBuilder.of(String.class, Integer.class)
|
||||||
.name("discount-loader")
|
.name("discount-loader")
|
||||||
.eternal(false)
|
|
||||||
.expireAfterWrite(10, TimeUnit.MILLISECONDS)
|
.expireAfterWrite(10, TimeUnit.MILLISECONDS)
|
||||||
.entryCapacity(100)
|
.entryCapacity(100)
|
||||||
.loader((key) -> {
|
.loader((key) -> {
|
||||||
LOGGER.info("Calculating discount for {}.", key);
|
cacheMissCount++;
|
||||||
return "Sports".equalsIgnoreCase(key) ? 20 : 10;
|
return "Sports".equalsIgnoreCase(key) ? 20 : 10;
|
||||||
})
|
})
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Integer getDiscount(String productType) {
|
public Integer getDiscount(String productType) {
|
||||||
Integer discount = cachedDiscounts.get(productType);
|
return cachedDiscounts.get(productType);
|
||||||
if (Objects.isNull(discount)) {
|
}
|
||||||
LOGGER.info("Discount for {} not found.", productType);
|
|
||||||
discount = 0;
|
public int getCacheMissCount() {
|
||||||
} else {
|
return cacheMissCount;
|
||||||
LOGGER.info("Discount for {} found.", productType);
|
|
||||||
}
|
|
||||||
return discount;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package com.baeldung.cache2k;
|
package com.baeldung.cache2k;
|
||||||
|
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import org.cache2k.Cache;
|
import org.cache2k.Cache;
|
||||||
@ -16,14 +15,15 @@ public class ProductHelperWithEventListener {
|
|||||||
|
|
||||||
private Cache<String, Integer> cachedDiscounts;
|
private Cache<String, Integer> cachedDiscounts;
|
||||||
|
|
||||||
|
private int cacheMissCount = 0;
|
||||||
|
|
||||||
public ProductHelperWithEventListener() {
|
public ProductHelperWithEventListener() {
|
||||||
cachedDiscounts = Cache2kBuilder.of(String.class, Integer.class)
|
cachedDiscounts = Cache2kBuilder.of(String.class, Integer.class)
|
||||||
.name("discount-listener")
|
.name("discount-listener")
|
||||||
.eternal(false)
|
|
||||||
.expireAfterWrite(10, TimeUnit.MILLISECONDS)
|
.expireAfterWrite(10, TimeUnit.MILLISECONDS)
|
||||||
.entryCapacity(100)
|
.entryCapacity(100)
|
||||||
.loader((key) -> {
|
.loader((key) -> {
|
||||||
LOGGER.info("Calculating discount for {}.", key);
|
cacheMissCount++;
|
||||||
return "Sports".equalsIgnoreCase(key) ? 20 : 10;
|
return "Sports".equalsIgnoreCase(key) ? 20 : 10;
|
||||||
})
|
})
|
||||||
.addListener(new CacheEntryCreatedListener<String, Integer>() {
|
.addListener(new CacheEntryCreatedListener<String, Integer>() {
|
||||||
@ -36,14 +36,11 @@ public class ProductHelperWithEventListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Integer getDiscount(String productType) {
|
public Integer getDiscount(String productType) {
|
||||||
Integer discount = cachedDiscounts.get(productType);
|
return cachedDiscounts.get(productType);
|
||||||
if (Objects.isNull(discount)) {
|
}
|
||||||
LOGGER.info("Discount for {} not found.", productType);
|
|
||||||
discount = 0;
|
public int getCacheMissCount() {
|
||||||
} else {
|
return cacheMissCount;
|
||||||
LOGGER.info("Discount for {} found.", productType);
|
|
||||||
}
|
|
||||||
return discount;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5,39 +5,34 @@ import java.util.concurrent.TimeUnit;
|
|||||||
|
|
||||||
import org.cache2k.Cache;
|
import org.cache2k.Cache;
|
||||||
import org.cache2k.Cache2kBuilder;
|
import org.cache2k.Cache2kBuilder;
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
public class ProductHelperWithExpiry {
|
public class ProductHelperWithExpiry {
|
||||||
|
|
||||||
final Logger LOGGER = LoggerFactory.getLogger(ProductHelperWithExpiry.class);
|
|
||||||
|
|
||||||
private Cache<String, Integer> cachedDiscounts;
|
private Cache<String, Integer> cachedDiscounts;
|
||||||
|
|
||||||
|
private int cacheMissCount = 0;
|
||||||
|
|
||||||
public ProductHelperWithExpiry() {
|
public ProductHelperWithExpiry() {
|
||||||
cachedDiscounts = Cache2kBuilder.of(String.class, Integer.class)
|
cachedDiscounts = Cache2kBuilder.of(String.class, Integer.class)
|
||||||
.name("discount-expiry")
|
.name("discount-expiry")
|
||||||
.eternal(false)
|
|
||||||
.expireAfterWrite(5, TimeUnit.MILLISECONDS)
|
.expireAfterWrite(5, TimeUnit.MILLISECONDS)
|
||||||
.entryCapacity(100)
|
.entryCapacity(100)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
initDiscountCache("Sports", 20);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void initDiscountCache(String productType, Integer value) {
|
|
||||||
cachedDiscounts.put(productType, value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Integer getDiscount(String productType) {
|
public Integer getDiscount(String productType) {
|
||||||
Integer discount = cachedDiscounts.get(productType);
|
Integer discount = cachedDiscounts.get(productType);
|
||||||
if (Objects.isNull(discount)) {
|
if (Objects.isNull(discount)) {
|
||||||
LOGGER.info("Discount for {} not found.", productType);
|
cacheMissCount++;
|
||||||
discount = 0;
|
discount = "Sports".equalsIgnoreCase(productType) ? 20 : 10;
|
||||||
} else {
|
cachedDiscounts.put(productType, discount);
|
||||||
LOGGER.info("Discount for {} found.", productType);
|
|
||||||
}
|
}
|
||||||
return discount;
|
return discount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getCacheMissCount() {
|
||||||
|
return cacheMissCount;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -6,12 +6,13 @@ import org.junit.Test;
|
|||||||
|
|
||||||
public class ProductHelperUnitTest {
|
public class ProductHelperUnitTest {
|
||||||
|
|
||||||
ProductHelper productHelper = new ProductHelper();
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void whenInvokedGetDiscount_thenGetItFromCache() {
|
public void whenInvokedGetDiscountTwice_thenGetItFromCache() {
|
||||||
|
ProductHelper productHelper = new ProductHelper();
|
||||||
|
assertTrue(productHelper.getCacheMissCount() == 0);
|
||||||
assertTrue(productHelper.getDiscount("Sports") == 20);
|
assertTrue(productHelper.getDiscount("Sports") == 20);
|
||||||
assertTrue(productHelper.getDiscount("Electronics") == 0);
|
assertTrue(productHelper.getDiscount("Sports") == 20);
|
||||||
|
assertTrue(productHelper.getCacheMissCount() == 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -6,12 +6,16 @@ import org.junit.Test;
|
|||||||
|
|
||||||
public class ProductHelperUsingLoaderUnitTest {
|
public class ProductHelperUsingLoaderUnitTest {
|
||||||
|
|
||||||
ProductHelperUsingLoader productHelper = new ProductHelperUsingLoader();
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void whenInvokedGetDiscount_thenPopulateCache() {
|
public void whenInvokedGetDiscount_thenPopulateCacheUsingLoader() {
|
||||||
|
ProductHelperUsingLoader productHelper = new ProductHelperUsingLoader();
|
||||||
|
assertTrue(productHelper.getCacheMissCount() == 0);
|
||||||
|
|
||||||
assertTrue(productHelper.getDiscount("Sports") == 20);
|
assertTrue(productHelper.getDiscount("Sports") == 20);
|
||||||
|
assertTrue(productHelper.getCacheMissCount() == 1);
|
||||||
|
|
||||||
assertTrue(productHelper.getDiscount("Electronics") == 10);
|
assertTrue(productHelper.getDiscount("Electronics") == 10);
|
||||||
|
assertTrue(productHelper.getCacheMissCount() == 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -6,10 +6,9 @@ import org.junit.Test;
|
|||||||
|
|
||||||
public class ProductHelperWithEventListenerUnitTest {
|
public class ProductHelperWithEventListenerUnitTest {
|
||||||
|
|
||||||
ProductHelperWithEventListener productHelper = new ProductHelperWithEventListener();
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void whenEntryAddedInCache_thenEventListenerCalled() {
|
public void whenEntryAddedInCache_thenEventListenerCalled() {
|
||||||
|
ProductHelperWithEventListener productHelper = new ProductHelperWithEventListener();
|
||||||
assertTrue(productHelper.getDiscount("Sports") == 20);
|
assertTrue(productHelper.getDiscount("Sports") == 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,13 +6,17 @@ import org.junit.Test;
|
|||||||
|
|
||||||
public class ProductHelperWithExpiryUnitTest {
|
public class ProductHelperWithExpiryUnitTest {
|
||||||
|
|
||||||
ProductHelperWithExpiry productHelper = new ProductHelperWithExpiry();
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void whenInvokedGetDiscountForExpiredProduct_thenNoDiscount() throws InterruptedException {
|
public void whenInvokedGetDiscountAfterExpiration_thenDiscountCalculatedAgain() throws InterruptedException {
|
||||||
|
ProductHelperWithExpiry productHelper = new ProductHelperWithExpiry();
|
||||||
|
assertTrue(productHelper.getCacheMissCount() == 0);
|
||||||
assertTrue(productHelper.getDiscount("Sports") == 20);
|
assertTrue(productHelper.getDiscount("Sports") == 20);
|
||||||
|
assertTrue(productHelper.getCacheMissCount() == 1);
|
||||||
|
|
||||||
Thread.sleep(20);
|
Thread.sleep(20);
|
||||||
assertTrue(productHelper.getDiscount("Sports") == 0);
|
|
||||||
|
assertTrue(productHelper.getDiscount("Sports") == 20);
|
||||||
|
assertTrue(productHelper.getCacheMissCount() == 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user