【问题标题】:ListenerObject not found in imports for Ehcache 3?在 Ehcache 3 的导入中找不到 ListenerObject?
【发布时间】:2017-08-22 22:10:32
【问题描述】:

我正在尝试使用以下代码为 Ehcache 3.3.1 项目实现侦听器。任何人都可以为 ListenerObject 提出解决方案吗?我似乎在任何地方都找不到它,除了在docs page 上我从

import java.util.logging.Level;
import java.util.logging.Logger;
import org.ehcache.Cache;
import org.ehcache.CacheManager;
import org.ehcache.config.builders.CacheConfigurationBuilder;
import org.ehcache.config.builders.CacheEventListenerConfigurationBuilder;
import org.ehcache.config.builders.CacheManagerBuilder;
import org.ehcache.config.builders.ResourcePoolsBuilder;
import org.ehcache.event.EventType;

public class CacheHandler{
     private Logger LOG = Logger.getLogger(this.getClass().getName());
     private String cacheName="basicCache";
     public Cache cache;

     public CacheHandler(){
         if(cache==null)
             cache=initCache();
     }
     private Cache initCache(){
       CacheEventListenerConfigurationBuilder cacheEventListenerConfiguration = CacheEventListenerConfigurationBuilder
           .newEventListenerConfiguration(new ListenerObject(), EventType.CREATED, EventType.UPDATED) 
           .unordered().asynchronous(); 

       final CacheManager manager = CacheManagerBuilder.newCacheManagerBuilder()
           .withCache(cacheName,
               CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class, String.class, ResourcePoolsBuilder.heap(10))
                   .add(cacheEventListenerConfiguration) 
           ).build(true);

       final Cache<String, String> cache = manager.getCache("foo", String.class, String.class);
       return cache;
     }

     public Cache getCache(){
        if(cache==null)
            cache=initCache();

        return cache;           
     }
}

【问题讨论】:

    标签: ehcache ehcache-3


    【解决方案1】:

    确实没有提到,但由于它只是一种方法,通常很容易弄清楚。

    这是一个例子:

    public class ListenerObject implements CacheEventListener<Object, Object> {
      @Override
      public void onEvent(CacheEvent<? extends Object, ? extends Object> event) {
        System.out.println(event);
      }
    }
    

    文档中真正使用的是here

    然后,我将您的代码玩了一下,变成了真正的生产可用代码。

    public class CacheHandler implements AutoCloseable {
      private static final String CACHE_NAME = "basicCache";
      private final Cache<String, String> cache;
      private final CacheManager cacheManager;
    
      public CacheHandler() {
        cacheManager = initCacheManager();
        cache = cacheManager.getCache(CACHE_NAME, String.class, String.class);
      }
    
      private CacheManager initCacheManager(){
        CacheEventListenerConfigurationBuilder cacheEventListenerConfiguration = CacheEventListenerConfigurationBuilder
          .newEventListenerConfiguration(new ListenerObject(), EventType.CREATED, EventType.UPDATED)
          .ordered().synchronous();
    
        return CacheManagerBuilder.newCacheManagerBuilder()
          .withCache(CACHE_NAME,
            CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class, String.class, ResourcePoolsBuilder.heap(10))
              .add(cacheEventListenerConfiguration)
          ).build(true);
      }
    
      public Cache getCache(){
        return cache;
      }
    
      @Override
      public void close() {
        cacheManager.close();
      }
    
      public static void main(String[] args) {
        try(CacheHandler handler = new CacheHandler()) {
          Cache<String, String> cache = handler.getCache();
          cache.put("a", "b");
          cache.putIfAbsent("a", "c");
        }
    
      }
    }
    

    一些cmets:

    • 我假设您希望将单例缓存保存在一个变量中。所以这就是我所做的。懒惰的 initCache 没有用,因为 withCache 告诉 Ehcache 在创建缓存管理器时创建缓存。
    • 我们希望保留对CacheManager 的引用,以便在最后关闭它。
    • getCache 正在检索“foo”,而不是“basicCache”

    【讨论】:

    • 感谢您的精彩回答!经过进一步阅读,我意识到我需要使用 Spring 注释并遇到问题。如果您有时间看一看,我将不胜感激:stackoverflow.com/questions/45865987/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    • 2021-03-16
    • 1970-01-01
    • 2018-08-21
    • 2022-08-21
    • 2011-03-09
    相关资源
    最近更新 更多