[JAVA] J'ai essayé légèrement le cache de résultat de la méthode de JCache (Ehcache 3) feat. Guice

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

  1. Ajouter l'API JCache et l'implémentation aux dépendances
  2. Ajoutez @ 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é,

  1. Ajouter l'API JCache et l'implémentation aux dépendances
  2. Guice semble être la seule option pour une utilisation autre que CDI et Spring Framework, alors faites de Guice une dépendance ajouter à
  3. Ajoutez cache-annotations-ri pour Guice aux dépendances
  4. Ajoutez @ javax.cache.annotation.CacheResult à la méthode que vous souhaitez mettre en cache dans POJO.
  5. Définissez javax.cache.annotation.CacheResolverFactory et JCache Interceptor

Cela devait être assez compliqué.

Yomoyama

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`.

Impressions

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é.

référence

Recommended Posts

J'ai essayé légèrement le cache de résultat de la méthode de JCache (Ehcache 3) feat. Guice
J'ai essayé d'expliquer la méthode
J'ai essayé d'utiliser le profileur d'IntelliJ IDEA
J'ai essayé d'utiliser la fonction Server Push de Servlet 4.0
05. J'ai essayé de supprimer la source de Spring Boot
J'ai essayé de réduire la capacité de Spring Boot
J'ai essayé le nouveau profileur de fonctionnalités d'IntelliJ IDEA 2019.2.
J'ai essayé de développer la fonction de cache d'Application Container Cloud Service dans l'environnement local
[Rails] J'ai essayé d'utiliser la méthode button_to pour la première fois
J'ai essayé de résumer les bases de kotlin et java
J'ai essayé JAX-RS et pris note de la procédure
J'ai brièvement résumé la grammaire de base de Ruby
J'ai essayé de créer un environnement de WSL2 + Docker + VSCode
J'ai essayé d'exprimer les résultats avant et après de la classe Date avec une ligne droite numérique
J'ai essayé le problème FizzBuzz
J'ai essayé de résoudre le problème de la "sélection multi-étapes" avec Ruby
J'ai essayé le type d'entrée / sortie de Java Lambda ~ Map edition ~
J'ai essayé de comprendre comment la méthode des rails "redirect_to" est définie
J'ai essayé de vérifier le fonctionnement du serveur gRPC avec grpcurl
J'ai essayé de comprendre comment la méthode des rails "link_to" est définie
J'ai essayé de résumer les méthodes de Java String et StringBuilder
[Java] J'ai essayé de faire un labyrinthe par la méthode de creusage ♪
J'ai essayé de résoudre le problème de Google Tech Dev Guide