Ce que j'ai utilisé
// Groovy Version: 2.4.5 JVM: 1.8.0_77 Vendor: Oracle Corporation OS: Mac OS X
@Grab('javax.cache:cache-api:1.0.0')
@Grab('org.ehcache:ehcache:3.2.0')
@Grab('org.jsr107.ri:cache-annotations-ri-guice:1.0.0')
@Grab('com.google.inject:guice:4.1.0')
import com.google.inject.AbstractModule
import com.google.inject.Guice
import com.google.inject.Injector
import org.jsr107.ri.annotations.guice.module.CacheAnnotationsModule
import javax.cache.CacheManager
import javax.cache.Caching
import javax.cache.annotation.CacheDefaults
import javax.cache.annotation.CacheResult
import javax.cache.configuration.Configuration
import javax.cache.configuration.MutableConfiguration
import javax.cache.expiry.AccessedExpiryPolicy
import javax.cache.expiry.Duration
import javax.cache.spi.CachingProvider
import java.text.SimpleDateFormat
import java.util.concurrent.TimeUnit
@CacheDefaults(cacheName = 'simpleCache')
class Sample {
@CacheResult
String hello() {
new SimpleDateFormat('yyyy-MM-dd HH:mm:ss.SSS').format(new Date())
}
}
CachingProvider cachingProvider = Caching.getCachingProvider();
CacheManager cacheManager = cachingProvider.getCacheManager();
Configuration<Object, Object> config =
new MutableConfiguration<Object, Object>()
.setTypes(Object.class, Object.class)
//Le cache est valide pendant 1 seconde
.setExpiryPolicyFactory(AccessedExpiryPolicy.factoryOf(new Duration(TimeUnit.SECONDS, 1)));
cacheManager.createCache('simpleCache', config)
Injector injector = Guice.createInjector(new CacheAnnotationsModule())
Sample sample = injector.getInstance(Sample.class);
println sample.hello()
println sample.hello()
println sample.hello()
println sample.hello()
println sample.hello()
//↑ signifie que la même heure est sortie
TimeUnit.SECONDS.sleep(1)
//Lorsque le cache est épuisé, il sera réacquis et une heure différente de celle ci-dessus sera affichée.
println sample.hello()
résultat
2016-12-24 14:04:27.284
2016-12-24 14:04:27.284
2016-12-24 14:04:27.284
2016-12-24 14:04:27.284
2016-12-24 14:04:27.284
2016-12-24 14:04:28.312 #Le résultat n'est différent qu'ici. Comme prévu
J'ai juste essayé de mettre en cache le résultat de la méthode sans utiliser CDI, mais cela a pris environ 20 heures. ..
La première hypothèse est
@ javax.cache.annotation.CacheResult
à la méthode que vous souhaitez mettre en cache dans POJO.Je pensais que ce serait possible, mais c'était complètement différent.
En réalité,
cache-annotations-ri
pour Guice aux dépendances@ javax.cache.annotation.CacheResult
à la méthode que vous souhaitez mettre en cache dans POJO.javax.cache.annotation.CacheResolverFactory
et JCache InterceptorCela devait être assez compliqué.
La clé et la valeur sont utilisées dans java.lang.Object
, qui est ʻorg.jsr107.ri.annotations.DefaultCacheResolverFactory # getCacheResolver is
javax.cache.CacheManager # getCache (java.lang.String) Appelant ʻinside [j'ai vu l'implémentation d'Ehcache](https://github.com/ehcache/ehcache3/blob/v3.2.0/107/src/main/java/org/ehcache/jsr107/Eh107CacheManager .java # L288-L292), car il s'est avéré que la clé et la valeur doivent être ʻObject`.
Si vous appelez javax.cache.CacheManager # getCache (java.lang.String, java.lang.Class <K>, java.lang.Class <V>)
, vous devriez pouvoir le gérer avec n'importe quel type, donc Si vous implémentez CacheResolverFactory vous-même, vous pouvez le modifier. Pour le moment, j'ai défini la clé et la valeur sur ʻObject
en mettant l'accent sur le déplacement rapide.
La configuration d'Interceptor utilise complètement le code du framework appelé Fathom. Je vous remercie. .. Je voudrais essayer ce cadre lui-même la prochaine fois.
[Ajout] ↑ Comme indiqué par @kazuhira_r, la quantité de code a été réduite en utilisant ʻorg.jsr107.ri.annotations.guice.module.CacheAnnotationsModule`.
JCache n'était pas quelque chose que vous pouviez essayer avec l'ambiance et l'élan comme Bean Validation. L'exemple de documentation n'a pas non plus aidé.
Recommended Posts