Пример за пролетно зареждане на Ehcache

1. Общ преглед

Нека разгледаме пример за използване на Ehcache с Spring Boot. Ще използваме Ehcache версия 3, тъй като това осигурява изпълнение на кеш мениджър JSR-107.

Примерът е проста услуга REST, която произвежда квадрата на число.

2. Зависимости

 org.springframework.boot spring-boot-starter-web 2.2.2.RELEASE   org.springframework.boot spring-boot-starter-cache 2.2.2.RELEASE  javax.cache cache-api 1.1.1   org.ehcache ehcache 3.8.1  
  • spring-boot-starter-web
  • пролет-обувка-стартер-кеш
  • javax.cache: cache-api
  • org.ehcache: ehcache

3. Пример

Нека създадем прост контролер REST, който извиква услуга за квадратиране на число и връща резултата като JSON низ:

@RestController @RequestMapping("/number", MediaType.APPLICATION_JSON_UTF8_VALUE) public class NumberController { // ... @Autowired private NumberService numberService; @GetMapping(path = "/square/{number}") public String getSquare(@PathVariable Long number) { log.info("call numberService to square {}", number); return String.format("{\"square\": %s}", numberService.square(number)); } }

Сега нека създадем услугата.

Анотираме метода с @Cacheable, така че Spring ще се справи с кеширането. В резултат на тази анотация Spring ще създаде прокси на NumberService за прихващане на извиквания към квадратния метод и извикване на Ehcache.

Трябва да предоставим името на кеша, който да използваме и по желание ключа. Можем също да добавим условие за ограничаване на кешираното:

@Service public class NumberService { // ... @Cacheable( value = "squareCache", key = "#number", condition = "#number>10") public BigDecimal square(Long number) { BigDecimal square = BigDecimal.valueOf(number) .multiply(BigDecimal.valueOf(number)); log.info("square of {} is {}", number, square); return square; } }

И накрая, нека създадем нашето основно приложение Spring Boot:

@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }

4. Конфигуриране на кеша

Трябва да добавим анотацията @EnableCaching на Spring към Spring bean, така че управлението на кеша, управлявано от анотации на Spring, да е активирано.

Нека създадем клас CacheConfig :

@Configuration @EnableCaching public class CacheConfig { }

Автоматичната конфигурация на Spring намира изпълнението на JSR-107 от Ehcache. По подразбиране обаче не се създават кешове.

Тъй като нито Spring, нито Ehcache търсят файл по подразбиране ehcache.xml . Добавяме следното свойство, за да кажем на Spring къде да го намери:

spring.cache.jcache.config=classpath:ehcache.xml 

Нека създадем файл ehcache.xml с кеш, наречен squareCache :

  java.lang.Long java.math.BigDecimal  30    com.baeldung.cachetest.config.CacheEventLogger ASYNCHRONOUS UNORDERED CREATED EXPIRED    2 10   

И нека също добавим слушателя на кеш събитие, който регистрира както СЪЗДАДЕНИ, така и ИЗТИЧАЛИ кеш събития:

public class CacheEventLogger implements CacheEventListener { // ... @Override public void onEvent( CacheEvent cacheEvent) { log.info(/* message */, cacheEvent.getKey(), cacheEvent.getOldValue(), cacheEvent.getNewValue()); } }

5. В действие

Можем да използваме Maven, за да стартираме това приложение, като стартираме mvn spring-boot: run .

След това отворете браузър и отворете услугата REST на порт 8080.

Ако отидем на // localhost: 8080 / number / square / 12, тогава ще се върнем {“square”: 144} и в дневника ще видим:

INFO [nio-8080-exec-1] c.b.cachetest.rest.NumberController : call numberService to square 12 INFO [nio-8080-exec-1] c.b.cachetest.service.NumberService : square of 12 is 144 INFO [e [_default_]-0] c.b.cachetest.config.CacheEventLogger : Cache event CREATED for item with key 12. Old value = null, New value = 144

Можем да видим регистрационното съобщение от квадратния метод на NumberService и събитието CREATED от EventLogger. Ако след това опресним браузъра, ще видим само следното добавено към дневника:

INFO [nio-8080-exec-2] c.b.cachetest.rest.NumberController : call numberService to square 12

Не се извиква регистрационното съобщение в квадратния метод на NumberService . Това ни показва, че се използва кешираната стойност.

Ако изчакаме 30 секунди кешираният елемент да изтече и опресним браузъра, ще видим ИЗТЕЧАЛО събитие и добавената стойност обратно в кеша:

INFO [nio-8080-exec-1] (...) NumberController : call numberService to square 12 INFO [e [_default_]-1] (...) CacheEventLogger : Cache event EXPIRED for item with key 12. Old value = 144,New value = null INFO [nio-8080-exec-1] (... )NumberService : square of 12 is 144 INFO [e [_default_]-1] (...) CacheEventLogger : Cache event CREATED for item with key 12. Old value = null, New value = 144

Ако въведем // localhost: 8080 / number / square / 3 в браузъра, ще получим верния отговор 9, но стойността не се кешира.

Това се дължи на условието, което използвахме в анотацията @Cacheable само за стойности в кеша за числа, по-големи от 10.

6. Заключение

В този бърз урок показахме как да настроим Ehcache с Spring Boot.

Както винаги, кодът може да бъде намерен в GitHub.