2017-07-01 1 views
0

J'essaie d'ajouter un comportement de mise en cache aux services utilisant l'annotation Spring @cacheable et en utilisant un gestionnaire de cache personnalisé dans le cadre de la configuration pour activer/désactiver la mise en cache lors de l'exécution.Impossible de connecter un gestionnaire de cache personnalisé via la bibliothèque partagée à Spring Boot Service

Ma classe de configuration personnalisée fonctionne correctement lorsqu'elle est utilisée dans le projet de service. Mais, quand je le fais partie d'une bibliothèque partagée et le référence dans le service, le comportement de mise en cache ne fonctionne pas. Donc, j'ai une bibliothèque partagée qui est maintenant référencée par mon service. Je veux utiliser la bibliothèque partagée pour que je puisse changer la stratégie de cacheManager en changeant à un autre gestionnaire de cache sans impact sur le client de service. Mais maintenant, la mise en cache ne fonctionne pas. Dans le même service, cela fonctionne, mais pas en tant que bibliothèque partagée.

Je ne suis pas sûr si une autre configuration de cache est configurée automatiquement ou non.

Je veux comprendre si j'ai besoin d'exclure certaines classes de configuration de cache ou de configurer ma configuration avant de créer une autre configuration.

Ma classe de configuration est la suivante. J'utilise un objet chaîne délimité par (,) pour créer les caches dans la classe à partir de la configuration de l'application.

@Configuration 
@EnableCaching 
@RefreshScope 
@AutoConfigureBefore(CacheAutoConfiguration.class) 
public class MyCustomCacheConfig { 

/* Flag to Determine if Cache should be Enabled or not for the service */ 
    @Value("${cacheEnabled}") 
    private boolean cacheEnabled; 

    /* Name of the caches to be created */ 
    @Value("${caches}") 
    private String caches; 


    @Bean 
    @Primary 
    @RefreshScope 
    CacheManager cacheManager() { 


     //If Cache is Enabled then swap the cacheManager for SimpleCacheManager 
     if (cacheEnabled) { 
     List<String> cacheNameList = Arrays.asList(caches.split(",")); 
     SimpleCacheManager cacheManager = new SimpleCacheManager(); 

     List<ConcurrentMapCache> conMapList = new ArrayList<>(); 
     for (int i = 0; i < cacheNameList.size(); i++) { 
      conMapList.add(new ConcurrentMapCache(cacheNameList.get(i))); 
     } 

     cacheManager.setCaches(conMapList); 

     return cacheManager; 
     }else{ 
      CacheManager cacheManager = new NoOpCacheManager(); 
      return cacheManager; 
     } 


    } 
} 

J'utilise l'approche autoconfiguration de démarrage standard ressort en ayant l'entrée ci-dessous dans le chemin src/main/resources/META-INF/spring.factories de ma composante de bibliothèque partagée.

**org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ 
com.demo.autoconfigure.MyCustomCacheConfig** 

Ainsi, je m'attends à ce que la configuration soit détectée au démarrage au démarrage du service. Je ai ajouté la bibliothèque comme une dépendance au service pom.xml

Depuis que j'ai plusieurs services auxquels je veux avoir cette fonctionnalité de commutation de cache on/off au moment de l'exécution, je pensais que je peux faire la configuration comme une bibliothèque partagée.

J'ai aussi partagé le dépôt complet, y compris le service, la composante de la mise en cache, le service de démonstration de configuration et la prise en pension de base de fichier dans le git ci-dessous,

https://github.com/bsridhar123/cache-demo-repo

quelqu'un peut me aider à identifier la cause du problème.

Répondre

0

J'ai trouvé la solution à mon problème.

Lorsque j'ai ajouté une entrée comme ci-dessous dans application.properties dans le composant de bibliothèque partagée et l'ai construit et référencé dans mon service, cela a fonctionné correctement.

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration 

J'ai aussi enlevé le @AutoConfigureBefore d'annotation j'avais plus tôt dans mes ins de classe de configuration bibliothèque partagée.

Semble exclure explicitement la classe d'autoconfiguration plutôt que d'utiliser les travaux d'annotatio, bien que j'ai dû ajouter une application.properties à ma bibliothèque.