Exemplo de Ehcache de inicialização de primavera

Exemplo de Ehcache de inicialização de primavera

1. Visão geral

Vejamos um exemplo de uso do Ehcache com Spring Boot. Usaremos o Ehcache versão 3, pois fornece uma implementação de um gerenciador de cacheJSR-107.

O exemplo é um serviço REST simples que produz o quadrado de um número.

2. Dependências


    org.springframework.boot
    spring-boot-starter-web
    2.1.1.RELEASE


    org.springframework.boot
    spring-boot-starter-cache
    2.1.1.RELEASE

    javax.cache
    cache-api
    1.1.0


    org.ehcache
    ehcache
    3.6.2

3. Exemplo

Vamos criar um controlador REST simples que chama um serviço para elevar o número ao quadrado e retorna o resultado como uma string 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));
    }
}

Agora vamos criar o serviço.

Anotamos o método com@Cacheable para que o Spring cuide do cache. As a result of this annotation, Spring will create a proxy of the NumberService to intercept calls to the square method and call Ehcache.

Precisamos fornecer o nome do cache a ser usado e, opcionalmente, a chave. Também podemos adicionar uma condição para restringir o que é armazenado em 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;
    }
}

Por fim, vamos criar nosso aplicativo Spring Boot principal:

@SpringBootApplication
public class Application {

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

4. Configuração de cache

Precisamos adicionar a anotação@EnableCaching do Spring a um bean Spring para que o gerenciamento de cache orientado por anotação do Spring seja habilitado.

Vamos criar uma classeCacheConfig:

@Configuration
@EnableCaching
public class CacheConfig {
}

A configuração automática do Spring encontra a implementação de Ehcache de JSR-107. No entanto, nenhum cache é criado por padrão.

Porque nem Spring nem Ehcache procuram por um arquivoehcache.xml padrão. Adicionamos a seguinte propriedade para informar ao Spring onde encontrá-lo:

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

Vamos criar um arquivoehcache.xml com um cache chamadosquareCache:



    
        java.lang.Long
        java.math.BigDecimal
        
            30
        

        
            
                com.example.cachetest.config.CacheEventLogger
                ASYNCHRONOUS
                UNORDERED
                CREATED
                EXPIRED
            
        

        
            2
            10
        
    

E vamos também adicionar o ouvinte de evento de cache que registra eventos de cacheCREATEDeEXPIRED:

public class CacheEventLogger
  implements CacheEventListener {

    // ...

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

5. Em ação

Podemos usar o Maven para iniciar este aplicativo executandomvn spring-boot:run.

Em seguida, abra um navegador e acesse o serviço REST na porta 8080.

Se formos parahttp://localhost:8080/number/square/12, then vamos voltar\{“square”:144}, e no log veremos:

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

Podemos ver a mensagem de log do métodosquare deNumberService, e o eventoCREATED do EventLogger. If we then refresh the browser we will only see the following added to the log:

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

A mensagem de log no métodosquare deNumberService não está sendo chamada. Isso nos mostra que o valor em cache está sendo usado.

If we wait 30 seconds for the cached item to expire and refresh the browser we’ll see an EXPIRED event, e o valor adicionado de volta ao 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

Se inserirmoshttp://localhost:8080/number/square/3 no navegador, obteremos a resposta correta de 9, mas o valor não é armazenado em cache.

Isso se deve à condição que usamos na anotação@Cacheable para armazenar somente valores de cache para números maiores que 10.

6. Conclusão

Neste tutorial rápido, mostramos como configurar o Ehcache com o Spring Boot.

Como sempre, o códigocan be found on GitHub.