Contoh Spring Boot Ehcache

1. Gambaran keseluruhan

Mari lihat contoh penggunaan Ehcache dengan Spring Boot. Kami akan menggunakan Ehcache versi 3 kerana ini menyediakan pelaksanaan pengurus cache JSR-107.

Contohnya ialah perkhidmatan REST sederhana yang menghasilkan kuasa dua nombor.

2. Kebergantungan

 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. Contoh

Mari buat pengawal REST ringkas yang memanggil perkhidmatan untuk membentuk nombor dan mengembalikan hasilnya sebagai rentetan 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)); } }

Sekarang mari buat perkhidmatan.

Kami memberi penjelasan kaedah dengan @Cacheable supaya Spring mengendalikan caching. Hasil daripada penjelasan ini, Spring akan mewujudkan proksi daripada NumberService panggilan pintasan kepada persegi kaedah dan panggilan Ehcache.

Kita perlu memberikan nama cache untuk digunakan dan opsional kuncinya. Kami juga dapat menambahkan syarat untuk menyekat apa yang di-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; } }

Akhirnya, mari buat aplikasi Spring Boot utama kami:

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

4. Konfigurasi Cache

Kita perlu menambahkan anotasi Spring @EnableCaching ke Spring bean supaya pengurusan cache yang didorong oleh anotasi Spring diaktifkan.

Mari buat kelas CacheConfig :

@Configuration @EnableCaching public class CacheConfig { }

Konfigurasi automatik Spring mendapati pelaksanaan JSR-107 oleh Ehcache. Walau bagaimanapun, tidak ada cache yang dibuat secara lalai.

Kerana Spring atau Ehcache tidak mencari fail ehcache.xml lalai . Kami menambahkan harta berikut untuk memberitahu Spring di mana mencarinya:

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

Mari buat fail ehcache.xml dengan cache yang dipanggil squareCache :

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

Dan mari kita tambahkan juga pendengar peristiwa cache yang mencatat kedua-dua peristiwa cache yang DIBUAT dan TAMBAHAN

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

5. Dalam Tindakan

Kita boleh menggunakan Maven untuk memulakan aplikasi ini dengan menjalankan mvn spring-boot: run .

Kemudian buka penyemak imbas dan akses perkhidmatan REST di port 8080.

Sekiranya kita pergi ke // localhost: 8080 / number / square / 12, maka kita akan kembali {"square": 144} , dan dalam log kita akan melihat:

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

Kita dapat melihat mesej log dari kaedah segiempat NumberService , dan peristiwa CREATED dari EventLogger. Sekiranya kita menyegarkan penyemak imbas, kita hanya akan melihat perkara berikut yang ditambahkan ke log:

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

Mesej log dalam kaedah segiempat NumberService tidak dipanggil. Ini menunjukkan bahawa nilai cache sedang digunakan.

Sekiranya kita menunggu 30 saat sehingga item yang di-cache habis dan menyegarkan penyemak imbas, kita akan melihat peristiwa yang LUAR BIASA , dan nilai ditambah kembali ke dalam 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

Sekiranya kita memasukkan // localhost: 8080 / number / square / 3 ke dalam penyemak imbas, kita akan mendapat jawapan 9 yang betul, tetapi nilainya tidak di-cache.

Ini kerana keadaan yang kami gunakan pada anotasi @Cacheable hanya untuk nilai cache untuk nombor yang lebih tinggi daripada 10.

6. Kesimpulannya

Dalam tutorial ringkas ini, kami menunjukkan cara menyiapkan Ehcache dengan Spring Boot.

Seperti biasa, kodnya boleh didapati di GitHub.