Spring Boot Ehcache Eksempel
1. Oversikt
La oss se på et eksempel på bruk av Ehcache med Spring Boot. Vi bruker Ehcache versjon 3 da dette gir en implementering av en JSR-107 cache manager.
Eksemplet er en enkel REST-tjeneste som produserer kvadratet til et tall.
2. Avhengigheter
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. Eksempel
La oss lage en enkel REST-kontroller som kaller en tjeneste for å firkantet et tall og returnerer resultatet som en JSON-streng:
@RestController @RequestMapping ("/ nummer", MediaType.APPLICATION_JSON_UTF8_VALUE) offentlig klasse NumberController {// ... @Autowired private NumberService numberService; @GetMapping (path = "/ square / {number}") public String getSquare (@PathVariable Long number) {log.info ("call numberService to square {}", nummer); returner String.format ("{\" firkant \ ":% s}", numberService.square (nummer)); }}
La oss nå opprette tjenesten.
Vi kommenterer metoden med @Cacheable slik at våren vil håndtere caching. Som et resultat av denne merknaden vil Spring opprette en fullmakt for NumberService å avskjære samtaler til torget metode og ring Ehcache.
Vi må oppgi navnet på hurtigbufferen og eventuelt nøkkelen. Vi kan også legge til en betingelse for å begrense det som er hurtigbufret:
@Service public class NumberService {// ... @Cacheable (value = "squareCache", key = "#number", condition = "#number> 10") public BigDecimal square (Long number) {BigDecimal square = BigDecimal.valueOf (nummer) .multiply (BigDecimal.valueOf (nummer)); log.info ("kvadrat av {} er {}", tall, kvadrat); retur firkant; }}
Til slutt, la oss lage vår viktigste Spring Boot-applikasjon:
@SpringBootApplication public class Application {public static void main (String [] args) {SpringApplication.run (Application.class, args); }}
4. Cache-konfigurasjon
Vi må legge til vårens @EnableCaching merknad til en vårbønne slik at vårens merkedrevne cacheadministrasjon er aktivert.
La oss lage en CacheConfig klasse:
@Configuration @EnableCaching offentlig klasse CacheConfig {}
Vårens autokonfigurasjon finner Ehcaches implementering av JSR-107. Imidlertid er ingen cacher opprettet som standard.
Fordi verken Spring eller Ehcache ser etter standard ehcache.xml fil. Vi legger til følgende eiendom for å fortelle Spring hvor du finner den:
spring.cache.jcache.config = classpath: ehcache.xml
La oss lage en ehcache.xml fil med hurtigbuffer kalt squareCache:
java.lang.Long java.math.BigDecimal 30 com.baeldung.cachetest.config.CacheEventLogger ASYNCHRONOUS UORDERED CREATED EXPIRED 2 10
Og la oss også legge til cache-hendelseslytteren som logger begge deler OPPRETT og UTLØPT cache-hendelser:
offentlig klasse CacheEventLogger implementerer CacheEventListener {// ... @ Override public void onEvent (CacheEvent cacheEvent) {log.info (/ * message * /, cacheEvent.getKey (), cacheEvent.getOldValue (), cacheEvent.getNewValue ()); }}
5. I aksjon
Vi kan bruke Maven til å starte denne appen ved å kjøre mvn spring-boot: run.
Åpne deretter en nettleser og få tilgang til REST-tjenesten på port 8080.
Hvis vi går til // localhost: 8080 / nummer / kvadrat / 12, så kommer vi tilbake {“Firkant”: 144}, og i loggen ser vi:
INFO [nio-8080-exec-1] cbcachetest.rest.NumberController: call numberService to square 12 INFO [nio-8080-exec-1] cbcachetest.service.NumberService: square of 12 er 144 INFO [e [_default_] -0] cbcachetest.config.CacheEventLogger: Cache-hendelse OPPRETT for element med nøkkel 12. Gammel verdi = null, Ny verdi = 144
Vi kan se loggmeldingen fra torget Metode av NumberService, og OPPRETT hendelse fra EventLogger. Hvis vi deretter oppdaterer nettleseren, ser vi bare følgende lagt til i loggen:
INFO [nio-8080-exec-2] c.b.cachetest.rest.NumberController: call numberService to square 12
Loggmeldingen i torget Metode av NumberService blir ikke påkalt. Dette viser oss at den bufrede verdien blir brukt.
Hvis vi venter i 30 sekunder på at hurtigbufret element utløper og oppdaterer nettleseren, ser vi en UTLØPT begivenhet, og verdien lagt til i hurtigbufferen:
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, Ny verdi = null INFO [nio-8080-exec-1] (...) NumberService: kvadrat på 12 er 144 INFO [e [_default _] - 1] (...) CacheEventLogger: Cache-hendelse OPPRETT for vare med nøkkel 12. Gammel verdi = null, Ny verdi = 144
Hvis vi kommer inn // localhost: 8080 / nummer / kvadrat / 3 i nettleseren får vi riktig svar på 9, men verdien er ikke hurtigbufret.
Dette er på grunn av tilstanden vi brukte på @Cacheable kommentar til bare cacheverdier for tall som er høyere enn 10.
6. Konklusjon
I denne raske opplæringen viste vi hvordan du setter opp Ehcache med Spring Boot.
Som alltid kan koden bli funnet på GitHub.