Рубрики
Без рубрики

Пример Spring Boot Ehcache

Краткое и практическое руководство по использованию Spring с Ehcache.

Автор оригинала: baeldung.

1. Обзор

Давайте рассмотрим пример использования Ehcache с Spring Boot. Мы будем использовать Ehcache версии 3, так как это обеспечивает реализацию диспетчера кэша JSR-107 .

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

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


    org.springframework.boot
    spring-boot-starter-web
    2.4.0


    org.springframework.boot
    spring-boot-starter-cache
    2.4.0

    javax.cache
    cache-api
    1.1.1


    org.ehcache
    ehcache
    3.8.1
     

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 создаст прокси-сервер службы Number для перехвата вызовов метода square и вызова 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. Конфигурация кэша

Нам нужно добавить аннотацию Spring @EnableCaching в компонент Spring, чтобы было включено управление кэшем на основе аннотаций Spring.

Давайте создадим Cache Config класс:

@Configuration
@EnableCaching
public class CacheConfig {
}

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

Потому что ни Spring, ни Ehcache не ищут значение по умолчанию ehcache.xml файл. Мы добавляем следующее свойство, чтобы сообщить Spring, где его найти:

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

Давайте создадим ehcache.xml файл с кэшем под названием square Cash :



    
        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.

Если мы пойдем в http://localhost:8080/number/square/12 , затем мы вернемся {“квадрат”: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

Мы можем видеть сообщение журнала из метода square службы Number и СОЗДАННОЕ событие из регистратора событий. Если мы затем обновим браузер, мы увидим только следующее, добавленное в журнал:

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

Сообщение журнала в методе square службы Number не вызывается. Это показывает нам, что используется кэшированное значение.

Если мы подождем 30 секунд, пока срок действия кэшированного элемента истечет, и обновим браузер, мы увидим событие EXPIRED , и добавленную стоимость обратно в кэш:

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

Если мы войдем http://localhost:8080/number/square/3 в браузере мы получаем правильный ответ 9, но значение не кэшируется.

Это связано с условием, которое мы использовали в аннотации @Cacheable , чтобы кэшировать только значения для чисел выше 10.

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

В этом кратком руководстве мы показали, как настроить Ehcache с помощью Spring Boot.

Как всегда, код можно найти на GitHub .