[JAVA] Ich habe den Ergebnis-Cache der Methode von JCache (Ehcache 3) feat. Guice leicht ausprobiert

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

  1. Fügen Sie den Abhängigkeiten die JCache-API und die Implementierung hinzu
  2. Fügen Sie der Methode, die Sie in POJO zwischenspeichern möchten, "@ javax.cache.annotation.CacheResult" hinzu.

Ich dachte, es wäre möglich, aber es war völlig anders.

Eigentlich,

  1. Fügen Sie den Abhängigkeiten die JCache-API und die Implementierung hinzu
  2. Guice scheint die einzige Option für die Verwendung außer CDI und Spring Framework zu sein. Machen Sie Guice also zu einer Abhängigkeit hinzufügen
  3. Fügen Sie Abhängigkeiten cache-annotations-ri für Guice hinzu
  4. Fügen Sie der Methode, die Sie in POJO zwischenspeichern möchten, "@ javax.cache.annotation.CacheResult" hinzu.
  5. Setzen Sie javax.cache.annotation.CacheResolverFactory und JCache Interceptor

Es musste ziemlich kompliziert sein.

Yomoyama

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 voninside [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 , java.lang.Class )" aufrufen, sollten Sie in der Lage sein, mit jedem Typ umzugehen, also " Wenn Sie CacheResolverFactory selbst implementieren, können Sie es ändern. Zur Zeit setze ich Schlüssel und Wert auf "Objekt", wobei der Schwerpunkt auf einer schnellen Bewegung liegt.

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.

Impressionen

JCache konnte man nicht mit der Stimmung und Dynamik wie Bean Validation ausprobieren. Die Beispieldokumentation hat auch nicht geholfen.

Referenz

Recommended Posts

Ich habe den Ergebnis-Cache der Methode von JCache (Ehcache 3) feat. Guice leicht ausprobiert
Ich habe versucht, die Methode zu erklären
Ich habe versucht, den Profiler von IntelliJ IDEA zu verwenden
Ich habe versucht, die Server-Push-Funktion von Servlet 4.0 zu verwenden
05. Ich habe versucht, die Quelle von Spring Boot zu löschen
Ich habe versucht, die Kapazität von Spring Boot zu reduzieren
Ich habe den neuen Feature-Profiler von IntelliJ IDEA 2019.2 ausprobiert.
Ich habe versucht, die Cache-Funktion von Application Container Cloud Service in der lokalen Umgebung zu entwickeln
[Rails] Ich habe zum ersten Mal versucht, die button_to-Methode zu verwenden
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Ich habe JAX-RS ausprobiert und mir das Verfahren notiert
Ich habe die grundlegende Grammatik von Ruby kurz zusammengefasst
Ich habe versucht, eine Umgebung mit WSL2 + Docker + VSCode zu erstellen
Ich habe versucht, die Ergebnisse vor und nach der Date-Klasse mit einer geraden Zahl auszudrücken
Ich habe das FizzBuzz-Problem ausprobiert
Ich habe versucht, das Problem der "mehrstufigen Auswahl" mit Ruby zu lösen
Ich habe den Eingabe- / Ausgabetyp von Java Lambda ~ Map Edition ~ ausprobiert
Ich habe versucht zu verstehen, wie die Rails-Methode "redirect_to" definiert ist
Ich habe versucht, den Betrieb des gRPC-Servers mit grpcurl zu überprüfen
Ich habe versucht zu verstehen, wie die Rails-Methode "link_to" definiert ist
Ich habe versucht, die Methoden von Java String und StringBuilder zusammenzufassen
[Java] Ich habe versucht, mit der Grabmethode ein Labyrinth zu erstellen ♪
Ich habe versucht, das Problem des Google Tech Dev Guide zu lösen