Статьи

Метод кеширования результатов с помощью JCache

В JCache есть удобная функциональность, которая прозрачно кеширует результаты методов. Вы можете аннотировать методы управляемых bean-компонентов с помощью @CacheResult и результат первого вызова будет возвращен снова без повторного вызова фактического метода.

01
02
03
04
05
06
07
08
09
10
11
12
13
import javax.cache.annotation.CacheResult;
// ...
 
public class Calculator {
 
    @CacheResult
    public String calculate() {
        // do some heavy lifting...
        LockSupport.parkNanos(2_000_000_000L);
 
        return "Hi Duke, it's " + Instant.now();
    }
}

Если бин вводится и вызывается метод calculate , результат будет кэширован после первого вызова. По умолчанию этот механизм не кэширует и не возвращает исключения.

Мы можем включить калькулятор в ресурс JAX-RS следующим образом:

01
02
03
04
05
06
07
08
09
10
11
@Path("calculation")
public class CalculationResource {
 
    @Inject
    Calculator calculator;
 
    @GET
    public String calculation() {
        return calculator.calculate();
    }
}

Вызов этого HTTP-ресурса вернет одно и то же значение для всех последующих вызовов.

Чтобы этот пример работал на серверах приложений Java EE, нам необходимо объявить перехватчик, который отвечает за кэширование результата. Это связано с тем, что JCache не включен в зонтик EE. Поэтому эти небольшие накладные расходы на конфигурацию должны быть сделаны на данный момент.

Если вы хотите запустить этот пример в WildFly, укажите перехватчик в beans.xml :

1
2
3
<interceptors>
    <class>org.infinispan.jcache.annotation.CacheResultInterceptor</class>
</interceptors>

WildFly использует Infinispan, который также должен быть добавлен в pom.xml в правильной версии.

01
02
03
04
05
06
07
08
09
10
<dependency>
    <groupId>javax.cache</groupId>
    <artifactId>cache-api</artifactId>
    <version>1.0.0</version>
</dependency>
<dependency>
    <groupId>org.infinispan</groupId>
    <artifactId>infinispan-jcache</artifactId>
    <version>8.2.4.Final</version>
</dependency>
Опубликовано на Java Code Geeks с разрешения Себастьяна Дашнера, партнера нашей программы JCG. Смотрите оригинальную статью здесь: Кэширование результатов метода с JCache

Мнения, высказанные участниками Java Code Geeks, являются их собственными.