Was ich benutzt habe
// 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)
//Der Cache ist 1 Sekunde lang gültig
.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()
//↑ bedeutet, dass dieselbe Zeit ausgegeben wird
TimeUnit.SECONDS.sleep(1)
//Wenn der Cache leer ist, wird er erneut erfasst und eine andere als die oben angegebene Zeit ausgegeben.
println sample.hello()
Ergebnis
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 #Das Ergebnis ist nur hier anders. Wie erwartet
Ich habe nur versucht, das Ergebnis der Methode ohne Verwendung von CDI zwischenzuspeichern, aber es dauerte ungefähr 20 Stunden. ..
Die erste Annahme ist
Ich dachte, es wäre möglich, aber es war völlig anders.
Eigentlich,
cache-annotations-ri
für Guice hinzujavax.cache.annotation.CacheResolverFactory
und JCache InterceptorEs musste ziemlich kompliziert sein.
Sowohl Schlüssel als auch Wert werden in java.lang.Object
verwendet, dh org.jsr107.ri.annotations.DefaultCacheResolverFactory # getCacheResolver
istjavax.cache.CacheManager # getCache (java.lang.String) Aufruf von
inside [Ich habe die Implementierung von Ehcache gesehen](https://github.com/ehcache/ehcache3/blob/v3.2.0/107/src/main/java/org/ehcache/jsr107/Eh107CacheManager .java # L288-L292), da sich herausstellte, dass der Schlüssel und der Wert "Objekt" sein müssen.
Wenn Sie "javax.cache.CacheManager # getCache (java.lang.String, java.lang.Class
Die Interceptor-Konfiguration verwendet vollständig den Code des Frameworks Fathom. Vielen Dank. .. Ich möchte dieses Framework beim nächsten Mal selbst ausprobieren.
[Ergänzung] ↑ Wie von @kazuhira_r hervorgehoben, wurde die Codemenge mithilfe von org.jsr107.ri.annotations.guice.module.CacheAnnotationsModule
reduziert.
JCache konnte man nicht mit der Stimmung und Dynamik wie Bean Validation ausprobieren. Die Beispieldokumentation hat auch nicht geholfen.
Recommended Posts