Primjer proljetnog čizma Ehcache

1. Pregled

Pogledajmo primjer korištenja Ehcachea s Spring Bootom. Koristit ćemo Ehcache verzije 3 jer ovo pruža implementaciju upravitelja predmemorije JSR-107.

Primjer je jednostavna REST usluga koja daje kvadrat broja.

2. Ovisnosti

 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 
  • proljeće-boot-starter-web
  • predmemorija boot-starter-cache
  • javax.cache: cache-api
  • org.ehcache: ehcache

3. Primjer

Stvorimo jednostavni REST kontroler koji poziva uslugu da kvadrira broj i vrati rezultat kao JSON niz:

@RestController @RequestMapping ("/ number", MediaType.APPLICATION_JSON_UTF8_VALUE) javna klasa NumberController {// ... @Autowired private NumberService numberService; @GetMapping (path = "/ square / {number}") javni niz getSquare (@PathVariable Long number) {log.info ("call numberService to square {}", number); vrati String.format ("{\" kvadrat \ ":% s}", numberService.square (broj)); }}

Ajmo sada stvoriti uslugu.

Metodu bilježimo s @Cacheable tako da će se Spring nositi s predmemoriranjem. Kao rezultat ove napomene, Spring će stvoriti proxy za NumberService za presretanje poziva kvadrat metodu i pozovite Ehcache.

Moramo navesti ime predmemorije koju ćemo koristiti i po želji ključ. Također možemo dodati uvjet da ograničimo ono što je predmemorirano:

@Service javna klasa NumberService {// ... @Cacheable (value = "squareCache", key = "#number", condition = "#number> 10") javni BigDecimal kvadrat (Dugi broj) {BigDecimal square = BigDecimal.valueOf (broj) .multiply (BigDecimal.valueOf (number)); log.info ("kvadrat od {} je {}", broj, kvadrat); povratni kvadrat; }}

Na kraju, kreirajmo našu glavnu aplikaciju Spring Boot:

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

4. Konfiguracija predmemorije

Moramo dodati Proljeće @EnableCaching napomena za proljetni grah tako da je omogućeno upravljanje predmemorijom vođeno bilješkama proljeća.

Stvorimo a CacheConfig razred:

@Configuration @EnableCaching javna klasa CacheConfig {}

Spring-ova automatska konfiguracija pronalazi Ehcacheovu implementaciju JSR-107. Međutim, prema zadanim postavkama nisu stvorene predmemorije.

Jer niti Spring niti Ehcache ne traže zadane postavke ehcache.xml datoteka. Dodamo sljedeće svojstvo kako bismo Springu rekli gdje ga može pronaći:

spring.cache.jcache.config = put staze: ehcache.xml 

Stvorimo ehcache.xml datoteka s predmemorijom pod nazivom squareCache:

  java.lang.Dugo java.math.BigDecimal 30 com.baeldung.cachetest.config.CacheEventLogger ASINHRONI NEUPRAVLJENI STVORENI ISTAKNUTI 2 10 

A dodajmo i slušatelj događaja cache koji zapisuje oba STVORENO i ISTEKAO događaji iz predmemorije:

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

5. Na djelu

Maven možemo koristiti za pokretanje ove aplikacije pokretanjem mvn spring-boot: trčanje.

Zatim otvorite preglednik i pristupite usluzi REST na portu 8080.

Ako odemo u // localhost: 8080 / broj / kvadrat / 12, onda ćemo se vratiti {"Kvadrat": 144}, a u zapisniku ćemo vidjeti:

INFO [nio-8080-exec-1] cbcachetest.rest.NumberController: poziv brojaService do kvadrata 12 INFO [nio-8080-exec-1] cbcachetest.service.NumberService: kvadrat od 12 je 144 INFO [e [_default_] -0] cbcachetest.config.CacheEventLogger: Događaj predmemorije STVOREN za stavku s ključem 12. Stara vrijednost = nula, Nova vrijednost = 144

Poruku dnevnika možemo vidjeti s kvadrat metoda NumberService, i STVORENO događaj iz EventLogger. Ako zatim osvježimo preglednik, u zapisnik ćemo vidjeti samo sljedeće:

INFO [nio-8080-exec-2] c.b.cachetest.rest.NumberController: nazovite numberService do kvadrata 12

Poruka dnevnika u kvadrat metoda NumberService ne poziva se. To nam pokazuje da se koristi predmemorirana vrijednost.

Ako pričekamo 30 sekundi da predmemorirana stavka istekne i osvježimo preglednik, vidjet ćemo ISTEKAO događaj, i vrijednost dodana natrag u predmemoriju:

INFO [nio-8080-exec-1] (...) NumberController: pozovite numberService na kvadrat 12 INFO [e [_default _] - 1] (...) CacheEventLogger: Cache event EXPIRED for item with key 12. Old value = 144, Nova vrijednost = null INFO [nio-8080-exec-1] (...) NumberService: kvadrat od 12 je 144 INFO [e [_default _] - 1] (...) CacheEventLogger: Cache event CREATED for item with ključ 12. Stara vrijednost = null, Nova vrijednost = 144

Ako uđemo // localhost: 8080 / broj / kvadrat / 3 u preglednik dobivamo točan odgovor 9, ali vrijednost nije predmemorirana.

To je zbog stanja koje smo koristili na @Cacheable napomena samo za vrijednosti predmemorije za brojeve veće od 10.

6. Zaključak

U ovom smo brzom vodiču pokazali kako postaviti Ehcache s Spring Bootom.

Kao i uvijek, kod se može naći na GitHubu.