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