Spring Boot Ehcache Beispiel

1. Übersicht

Schauen wir uns ein Beispiel für die Verwendung von Ehcache mit Spring Boot an. Wir werden Ehcache Version 3 verwenden, da dies eine Implementierung eines JSR-107-Cache-Managers bietet.

Das Beispiel ist ein einfacher REST-Service, der das Quadrat einer Zahl erzeugt.

2. Abhängigkeiten

 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
  • Spring-Boot-Starter-Cache
  • javax.cache: cache-api
  • org.ehcache: ehcache

3. Beispiel

Erstellen wir einen einfachen REST-Controller, der einen Service aufruft, um eine Zahl zu quadrieren, und das Ergebnis als JSON-Zeichenfolge zurückgibt:

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

Jetzt erstellen wir den Service.

Wir kommentieren die Methode mit @Cacheable, damit Spring das Caching übernimmt. Als Ergebnis dieser Annotation erstellt Spring einen Proxy des NumberService , um Aufrufe der Quadratmethode abzufangen und Ehcache aufzurufen.

Wir müssen den Namen des zu verwendenden Caches und optional den Schlüssel angeben. Wir können auch eine Bedingung hinzufügen, um das Zwischengespeicherte einzuschränken:

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

Lassen Sie uns abschließend unsere Hauptanwendung für Spring Boot erstellen:

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

4. Cache-Konfiguration

Wir müssen die Spring- Annotation @EnableCaching zu einer Spring-Bean hinzufügen, damit die annotationsgesteuerte Cache-Verwaltung von Spring aktiviert ist.

Erstellen wir eine CacheConfig- Klasse:

@Configuration @EnableCaching public class CacheConfig { }

Die automatische Konfiguration von Spring findet Ehcaches Implementierung von JSR-107. Standardmäßig werden jedoch keine Caches erstellt.

Weil weder Spring noch Ehcache nach einer Standarddatei ehcache.xml suchen . Wir fügen die folgende Eigenschaft hinzu, um Spring mitzuteilen, wo sie zu finden ist:

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

Erstellen wir eine ehcache.xml- Datei mit einem Cache namens squareCache :

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

Fügen wir außerdem den Listener für Cache-Ereignisse hinzu, der sowohl CREATED- als auch EXPIRED- Cache-Ereignisse protokolliert :

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

5. In Aktion

Wir können Maven verwenden, um diese App zu starten, indem wir mvn spring-boot: run ausführen .

Öffnen Sie dann einen Browser und greifen Sie auf den REST-Service an Port 8080 zu.

Wenn wir zu // localhost: 8080 / number / square / 12 gehen, erhalten wir {"square": 144} zurück und im Protokoll sehen wir:

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

Wir können die Protokollnachricht von der Quadratmethode von NumberService und das Ereignis CREATED vom EventLogger sehen. Wenn wir dann den Browser aktualisieren, wird dem Protokoll nur Folgendes hinzugefügt:

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

Die Protokollnachricht in der Quadratmethode von NumberService wird nicht aufgerufen. Dies zeigt uns, dass der zwischengespeicherte Wert verwendet wird.

Wenn wir 30 Sekunden warten, bis das zwischengespeicherte Element abläuft, und den Browser aktualisieren , wird ein EXPIRED- Ereignis angezeigt und der Mehrwert wieder in den Cache aufgenommen:

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

Wenn wir // localhost: 8080 / number / square / 3 in den Browser eingeben , erhalten wir die richtige Antwort von 9, aber der Wert wird nicht zwischengespeichert.

Dies liegt an der Bedingung, die wir für die Annotation @Cacheable verwendet haben, um nur Werte für Zahlen über 10 zwischenzuspeichern.

6. Fazit

In diesem kurzen Tutorial haben wir gezeigt, wie Ehcache mit Spring Boot eingerichtet wird.

Der Code ist wie immer auf GitHub zu finden.