标签: google-guava-cache

spring-security-rest和guava之间的间接jar冲突导致NoSuchMethod错误

我用grails 3.1.16

的build.gradle:

dependencies {
    compile "com.google.guava:guava:18.0"
    compile "org.grails.plugins:spring-security-rest:2.0.0.M2"
}
Run Code Online (Sandbox Code Playgroud)

在运行此代码时:

   private LoadingCache<String, Boolean> attempts

    @PostConstruct
    void init() {
        Integer time = ApplicationContextHolder.getProperty(ApplicationContextHolder.config.time)
        attempts = CacheBuilder.newBuilder()
                .expireAfterWrite(time, TimeUnit.MINUTES)
                .build({ 0 } as CacheLoader)
    }
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Caused by: java.lang.NoSuchMethodError: com.google.common.base.Platform.systemNanoTime()J
        at com.google.common.base.LocalCache(Ticker.java:60)
        at com.google.common.cache.LocalCache$Segment.put(LocalCache.java:2827)
        at com.google.common.cache.LocalCache.put(LocalCache.java:4149)
        at com.google.common.cache.LocalCache$LocalManualCache.put(LocalCache.java:4754)
        at com.google.common.cache.Cache$put.call(Unknown Source)
Run Code Online (Sandbox Code Playgroud)

在运行依赖项报告之后,我发现问题是由Spring Security REST插件的依赖引起的:(com.google.guava:guava-base:r03) - 使用相同的包名"com.google.common. base"和Platform.class没有这样的方法systemNanoTime()

|    +--- org.grails.plugins:spring-security-rest:2.0.0.M2
|    |    +--- com.google.guava:guava-io:r03
|    |    |    +--- com.google.guava:guava-annotations:r03
|    |    |    \--- com.google.guava:guava-base:r03
|    |    |         \--- com.google.guava:guava-annotations:r03
Run Code Online (Sandbox Code Playgroud)

任何解决这个问题的想法?

grails guava google-guava-cache grails-3.1 grails3

9
推荐指数
2
解决办法
291
查看次数

对调用静态方法的类进行单元测试

我试图对类“ A”进行单元测试,该类调用类“ B”的静态方法。类“ B”本质上具有Google番石榴缓存,该缓存从给定键的缓存中检索值(对象),或使用服务适配器将对象加载到缓存中(如果发生缓存丢失)。反过来,service-adapter类还具有其他自动关联的依赖项来检索对象。

这些是出于说明目的的类:

A级

public class A {
    public Object getCachedObject(String key) {
        return B.getObjectFromCache(key);
    }
}
Run Code Online (Sandbox Code Playgroud)

B级

public class B {

    private ServiceAdapter serviceAdapter;

    public void setServiceAdapter(ServiceAdapter serAdapt) {
        serviceAdapter = serAdapt;
    } 

    private static final LoadingCache<String, Object> CACHE = CacheBuilder.newBuilder()
                .maximumSize(100) 
                .expireAfterWrite(30, TimeUnit.MINUTES)
                .build(new MyCacheLoader());

    public static Object getObjectFromCache(final String key) throws ExecutionException {
        return CACHE.get(warehouseId);
    }

    private static class MyCacheLoader extends CacheLoader<String, Object>  {

        @Override
        public Object load(final String key) throws Exception {
            return serviceAdapter.getFromService(key) …
Run Code Online (Sandbox Code Playgroud)

java static-methods unit-testing easymock google-guava-cache

5
推荐指数
1
解决办法
2万
查看次数

java - google guava缓存invalidateAll()和cleanUp()之间的区别

说我的Cache定义如下:

private static Cache<String, Long> alertsUIDCache = CacheBuilder.newBuilder().
           expireAfterAccess(60).build();
Run Code Online (Sandbox Code Playgroud)

从我读到的内容(如果我错了请纠正我):

如果Cache在0:00 写入值,则应在60秒后将其移至"准备被驱逐"状态.实际删除的值Cache将在下一次缓存修改时发生(什么是缓存修改?).是对的吗?

另外,我不确定invalidateAll()cleanUp()方法之间有什么区别,有人可以提供解释吗?

java guava google-guava-cache

5
推荐指数
1
解决办法
2986
查看次数

Guava LoadingCache:为什么一起使用refreshAfterWrite和expireAfterWrite

我阅读了这篇文章,解释了Guava Cache:CachesExplained.我确实理解了refreshAfterWrite和expireAfterWrite正在做什么.但是,在解释refreshAfterWrite时,该文档还提到了这一点:

" 因此,例如,您可以在同一缓存上指定refreshAfterWrite和expireAfterWrite,这样只要条目有资格进行刷新,条目上的到期计时器就不会被盲目重置,因此如果条目之后没有查询条目有资格刷新,允许过期. "

这是令我困惑的部分.根据我的理解,如果您想要自动刷新密钥,您只需要指定refreshAfterWrite.为什么我们甚至想在使用refreshAfterWrite时使用expireAfterWrite?

java guava google-guava-cache

5
推荐指数
1
解决办法
3750
查看次数

LoadingCache expireAfterWrite 没有按预期工作

我有一个这样的加载缓存:

MyCacheLoader loader=new MyCacheLoader();
MyRemovalListener listener=new MyRemovalListener();
LoadingCache<String, String> myCache = CacheBuilder.newBuilder()
                .concurrencyLevel(10)
                .weakKeys()
                .maximumSize(2)
                .expireAfterWrite(120, TimeUnit.SECONDS)
                .removalListener(listener)
                .build(loader);
Run Code Online (Sandbox Code Playgroud)

但是当我做这样的事情来测试时:

System.out.println(myCache.get("100"));
System.out.println(myCache.get("103"));
System.out.println(myCache.get("110"));
System.out.println(myCache).get("111"));
Thread.sleep(230000);
System.out.println(myCache.size());
Run Code Online (Sandbox Code Playgroud)

我仍然得到 2 而不是零。为什么 ?超过 120 秒后,如果我没有错的话,我的大小应该为零吗?

我的缓存加载器

public class MyCacheLoader extends CacheLoader<String,String>     {
    @Override
    public String load(String key) throws Exception {
        return key;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的移除监听器

public class MyRemovalListener implements RemovalListener<String,String> {

    Logger logger = LoggerFactory.getLogger(MyRemovalListener.class);
    @Override
    public void onRemoval(RemovalNotification<String, String> removalNotification) {
        logger.info("Message with message Id ("+
                removalNotification.getKey()+ ") is removed.");
        System.out.println("Message with …
Run Code Online (Sandbox Code Playgroud)

java guava google-guava-cache

4
推荐指数
1
解决办法
3113
查看次数

谷歌缓存可以在集群环境中工作吗

我正在使用谷歌缓存在单例 ejb 中缓存数据。并且缓存的资源被多个 ejb 使用。但是现在不确定如果部署在可以存在多个 JVM 的多节点集群环境中,同一个应用程序是否可以工作。

请指教!

guava google-guava-cache jakarta-ee

3
推荐指数
1
解决办法
3751
查看次数

Guava CacheLoader引发并捕获自定义异常

我正在尝试使用Google Guava缓存按服务相关对象进行缓存。在发生缓存未命中时,我使用我的REST客户端来获取对象。我知道我可以通过以下方式做到这一点:

CacheLoader<Key, Graph> loader = new CacheLoader<Key, Graph>() {
     public Graph load(Key key) throws InternalServerException, ResourceNotFoundException {
       return client.get(key);
     }
   };
   LoadingCache<Key, Graph> cache = CacheBuilder.newBuilder().build(loader)
Run Code Online (Sandbox Code Playgroud)

现在,client.getKey(Key k)实际上抛出InternalServerExceptionResourceNotFoundException。当我尝试使用此缓存实例获取对象时,可以将异常捕获为ExecutionException

try {
  cache.get(key);
} catch (ExecutionException e){

}
Run Code Online (Sandbox Code Playgroud)

但是,我想专门捕获并处理我定义的CacheLoader抛出的异常(即InternalServerExceptionResourceNotFoundException)。

我不确定是否检查的实例是否ExecutionException是我自己的异常之一,是否会导致load()方法的签名实际上抛出Exception而不是ExecutionException。即使我可以使用instanceof,它也不是很干净。有解决这个问题的好方法吗?

java guava google-guava-cache

3
推荐指数
1
解决办法
2897
查看次数

如何使用guava谓词在数组列表中获取重复元素

我有一组包含元素的数组.我需要通过使用java中断言的guava比较特定字段来找到该数组中的重复元素.

例如:
我有一个带有员工详细信息的arraylist.我需要找到同名员工的详细信息.

java guava predicates google-guava-cache

2
推荐指数
1
解决办法
1935
查看次数

如何确定番石榴缓存中是否存在某个键,以便我不覆盖它?

我有一个番石榴缓存,我想弄清楚某个特定的密钥是否已经存在,这样我就不会覆盖它们?这可能与番石榴缓存有关吗?

private final Cache<Long, PendingMessage> cache = CacheBuilder.newBuilder()
    .maximumSize(1_000_000)
    .concurrencyLevel(100)
    .build()

// there is no put method like this
if (cache.put(key, value) != null) {
  throw new IllegalArgumentException("Message for " + key + " already in queue");
}
Run Code Online (Sandbox Code Playgroud)

看起来没有返回布尔值的 put 方法,我可以在其中确定键是否已经存在。有没有其他方法可以确定密钥是否已经存在,这样我就不会覆盖它?

java guava google-guava-cache

2
推荐指数
1
解决办法
6655
查看次数

番石榴缓存的removeListener是否在单独的线程中运行?

当我从番石榴缓存中删除对象时,我想执行一些清理操作。但是我需要一段时间后再做。我可以在那里睡觉吗?会阻塞所有线程吗?还是removeListener在单独的线程中运行?

CacheBuilder.newBuilder().
.removalListener(notification -> {
    try {
        Thread.sleep(10 * 60 * 1000);
    } catch (InterruptedException e) {
    }
    try {
        //close
    } catch (final IOException e) {
    }
})
.build();
Run Code Online (Sandbox Code Playgroud)

guava google-guava-cache

1
推荐指数
1
解决办法
369
查看次数