2015-08-06 10 views
9

Setup:Wie konfiguriere ich benutzerdefinierte Ehcaches im Play-Framework?

  • Spiel Rahmen 2.4.0
  • Einbau-ehcache
  • java

ich das Handbuch bei https://www.playframework.com/documentation/2.4.0/JavaCache gefolgt sind und Caches zu trennen und verschiedene Konfigurationen (Cache-Größen verwenden , Lebensdauern etc) Ich konfiguriere in application.conf:

play.cache.bindCaches = ["mycache1-cache","mycache2-cache"] 

Dann sie zu konfigurieren, habe ich die übliche ehcache.xml Datei

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd" updateCheck="false"> 

    <defaultCache 
     maxBytesLocalHeap="256000000" 
     eternal="false" 
     timeToIdleSeconds="120" 
     timeToLiveSeconds="120" 
     overflowToDisk="false" 
     maxElementsOnDisk="10000" 
     diskPersistent="false" 
     diskExpiryThreadIntervalSeconds="120" 
     memoryStoreEvictionPolicy="LRU" 
     /> 

    <cache name="mycache1-cache" 
      maxBytesLocalHeap="256000000" 
      eternal="false" 
      timeToIdleSeconds="86400" 
      timeToLiveSeconds="86400" 
      overflowToDisk="true" 
      maxElementsOnDisk="1000000" 
      diskPersistent="true" 
      diskExpiryThreadIntervalSeconds="1200" 
      memoryStoreEvictionPolicy="LRU" 
      /> 

</ehcache> 

Es funktioniert, wenn ich immer nur die defaultCache, aber sobald ich den benutzerdefinierten Cache hinzufügen, Spiel wirft mit:

ProvisionException: Kann nicht Bereitstellung finden Sie in den folgenden Fehler: 1) Fehler in benutzerdefinierten Anbieter, net.sf.ehcache.ObjectExistsException: Cache mycache1-Cache existiert bereits

jedoch Wenn ich den Cache nur in ehcache.xml, aber nicht in application.conf definiere, weiß play nicht darüber und wirft.

+0

Ist das der volle StackTrace? – dan

+0

'Spiel weiß nicht darüber und wirft' -> welche Ausnahme wird durch das Spiel geworfen? –

+0

Haben Sie Glück dabei? – metasim

Antwort

0

Ich habe auch das gleiche Problem vor einem Monat konfrontiert und versucht, über Internet und unter Lösung zu suchen, die für mich funktioniert. Sie können auch versuchen, dasselbe zu tun.

/** Bind named caches using configuration in ehcache.xml. Define a named cache in ehcache.xml and Ehcache will automatically instantiate the cache at runtime. However,this cache is unknown to the Play cache plugin and is not accessible using {@code @NamedCache}. You must bind a reference to the named cache using {@link CacheModule#bindCustomCache(String)}. Do not add the named cache to {@code play.cache.bindCaches} in configuration. Caches bound in this manner are programmatically added by the Play cache plugin at runtime. The cache plugin will always copy settings from the default cache, limiting the usefulness of named caches. **/ 

public class CacheModule extends AbstractModule { 

@Override 
protected void configure() { 
    bindCustomCache("tenants"); 
    bindCustomCache("user-agent"); 
    bindCustomCache("geo-ip"); 
    bindCustomCache("full-contact"); 
} 

/** 
* Bind a named cache that is defined in ehcache.xml. 
* 
* @param name The name of the cache. 
*/ 
private void bindCustomCache(String name) { 
    bind(CacheApi.class) 
      .annotatedWith(new NamedCacheImpl(name)) 
      .toProvider(new Provider<CacheApi>() { 

       @Inject 
       CacheManager cacheManager; 

       @Override 
       public CacheApi get() { 
        Cache cache = cacheManager.getCache(name); 
        if (cache == null) { 
         throw new RuntimeException("Cache named '" + name + "' must be defined in ehcache.xml"); 
        } 
        return new DefaultCacheApi(new EhCacheApi(cache)); 
       } 

      }) 
      .asEagerSingleton(); 
    } 
} 

ich mein benannte Caches in ehcache.xml erstellen und muß nur eine einzeilige bindCustomCache() mit der configure Methode hinzufügen.