В 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, являются их собственными. |