Exemple de Spring Boot Ehcache

1. Vue d'ensemble

Regardons un exemple d'utilisation d'Ehcache avec Spring Boot. Nous utiliserons Ehcache version 3 car cela fournit une implémentation d'un gestionnaire de cache JSR-107.

L'exemple est un service REST simple qui produit le carré d'un nombre.

2. Dépendances

 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  
  • ressort-boot-starter-web
  • cache-démarrage-printemps
  • javax.cache: cache-api
  • org.ehcache: ehcache

3. Exemple

Créons un simple contrôleur REST qui appelle un service pour mettre un nombre au carré et renvoie le résultat sous forme de chaîne 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)); } }

Créons maintenant le service.

Nous annotons la méthode avec @Cacheable afin que Spring gère la mise en cache. À la suite de cette annotation, Spring créera un proxy du NumberService pour intercepter les appels à la méthode square et appeler Ehcache.

Nous devons fournir le nom du cache à utiliser et éventuellement la clé. Nous pouvons également ajouter une condition pour restreindre ce qui est mis en cache:

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

Enfin, créons notre principale application Spring Boot:

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

4. Configuration du cache

Nous devons ajouter l' annotation @EnableCaching de Spring à un bean Spring afin que la gestion du cache basée sur les annotations de Spring soit activée.

Créons une classe CacheConfig :

@Configuration @EnableCaching public class CacheConfig { }

L'auto-configuration de Spring trouve l'implémentation d'Ehcache de JSR-107. Cependant, aucun cache n'est créé par défaut.

Parce que ni Spring ni Ehcache ne recherchent un fichier ehcache.xml par défaut . Nous ajoutons la propriété suivante pour indiquer à Spring où le trouver:

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

Créons un fichier ehcache.xml avec un cache appelé squareCache :

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

Et nous allons aussi ajouter l'écouteur d'événement de cache qui enregistre les CREES et PÉRIMÉS cache des événements:

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

5. En action

Nous pouvons utiliser Maven pour démarrer cette application en exécutant mvn spring-boot: run .

Ensuite, ouvrez un navigateur et accédez au service REST sur le port 8080.

Si nous allons à // localhost: 8080 / number / square / 12, alors nous reviendrons {“square”: 144} , et dans le journal, nous verrons:

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

Nous pouvons voir le message du journal de la méthode square de NumberService et l' événement CREATED de EventLogger. Si nous actualisons ensuite le navigateur, nous ne verrons que les éléments suivants ajoutés au journal:

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

Le message de journal dans la méthode square de NumberService n'est pas appelé. Cela nous montre que la valeur mise en cache est utilisée.

Si nous attendons 30 secondes que l'élément mis en cache expire et que nous actualisons le navigateur, nous verrons un événement EXPIRED et la valeur ajoutée dans le cache:

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 nous saisissons // localhost: 8080 / number / square / 3 dans le navigateur, nous obtenons la bonne réponse de 9, mais la valeur n'est pas mise en cache.

Cela est dû à la condition que nous avons utilisée sur l' annotation @Cacheable pour ne mettre en cache que les valeurs des nombres supérieurs à 10.

6. Conclusion

Dans ce tutoriel rapide, nous avons montré comment configurer Ehcache avec Spring Boot.

Comme toujours, le code est disponible sur GitHub.