Ejemplo de Spring Boot Ehcache

1. Información general

Veamos un ejemplo del uso de Ehcache con Spring Boot. Usaremos Ehcache versión 3 ya que proporciona una implementación de un administrador de caché JSR-107.

El ejemplo es un servicio REST simple que produce el cuadrado de un número.

2. Dependencias

 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
  • caché de arranque de arranque de primavera
  • javax.cache: cache-api
  • org.ehcache: ehcache

3. Ejemplo

Creemos un controlador REST simple que llame a un servicio para cuadrar un número y devuelva el resultado como una cadena 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)); } }

Ahora creemos el servicio.

Anotamos el método con @Cacheable para que Spring maneje el almacenamiento en caché. Como resultado de esta anotación, Spring creará un proxy de NumberService para interceptar llamadas al método cuadrado y llamar a Ehcache.

Necesitamos proporcionar el nombre de la caché a usar y, opcionalmente, la clave. También podemos agregar una condición para restringir lo que se almacena en caché:

@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; } }

Finalmente, creemos nuestra aplicación principal Spring Boot:

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

4. Configuración de caché

Necesitamos agregar la anotación @EnableCaching de Spring a un bean de Spring para que la administración de caché basada en anotaciones de Spring esté habilitada.

Creemos una clase CacheConfig :

@Configuration @EnableCaching public class CacheConfig { }

La configuración automática de Spring encuentra la implementación de JSR-107 de Ehcache. Sin embargo, no se crean cachés de forma predeterminada.

Porque ni Spring ni Ehcache buscan un archivo ehcache.xml predeterminado . Agregamos la siguiente propiedad para decirle a Spring dónde encontrarla:

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

Creemos un archivo ehcache.xml con un caché llamado squareCache :

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

Y también agreguemos el detector de eventos de caché que registra eventos de caché CREADOS y EXPIRADOS :

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

5. En acción

Podemos usar Maven para iniciar esta aplicación ejecutando mvn spring-boot: run .

Luego abra un navegador y acceda al servicio REST en el puerto 8080.

Si vamos a // localhost: 8080 / number / square / 12, volveremos {“square”: 144} , y en el registro veremos:

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

Podemos ver el mensaje de registro del método cuadrado de NumberService y el evento CREATED del EventLogger. Si luego actualizamos el navegador, solo veremos lo siguiente agregado al registro:

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

No se invoca el mensaje de registro en el método cuadrado de NumberService . Esto nos muestra que se está utilizando el valor almacenado en caché.

Si esperamos 30 segundos para que el elemento almacenado en caché expire y refrescamos el navegador, veremos un evento EXPIRED y el valor agregado nuevamente en el caché:

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

Si ingresamos // localhost: 8080 / number / square / 3 en el navegador, obtenemos la respuesta correcta de 9, pero el valor no se almacena en caché.

Esto se debe a la condición que usamos en la anotación @Cacheable para almacenar en caché solo los valores para números superiores a 10.

6. Conclusión

En este tutorial rápido, mostramos cómo configurar Ehcache con Spring Boot.

Como siempre, el código se puede encontrar en GitHub.