Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 番石榴';t调用删除侦听器_Java_Collections_Guava - Fatal编程技术网

Java 番石榴';t调用删除侦听器

Java 番石榴';t调用删除侦听器,java,collections,guava,Java,Collections,Guava,我希望:在由于超时过期而删除实体时得到通知 我尝试了:设置删除侦听器 问题:删除侦听器似乎无法正常工作。仅当我将新项目放入缓存时,它才起作用(请参见下面的代码) 问题:如何在不放置新项的情况下使删除侦听器工作 代码: 我的加载缓存: p.S:如果您需要,我可以在GitHub上分享完整的演示,只需告诉我这是因为Guava不能确保超时值过期时自动收回值。但是,它会在一系列读写操作期间执行此操作 根据其文件: 使用CacheBuilder生成的缓存不执行清除和逐出值 “自动”,或在值过期后立即,或 那

我希望:在由于超时过期而删除实体时得到通知

我尝试了:设置删除侦听器

问题:删除侦听器似乎无法正常工作。仅当我将新项目放入缓存时,它才起作用(请参见下面的代码)

问题:如何在不放置新项的情况下使删除侦听器工作

代码:

我的加载缓存:


p.S:如果您需要,我可以在GitHub上分享完整的演示,只需告诉我

这是因为Guava不能确保超时值过期时自动收回值。但是,它会在一系列读写操作期间执行此操作

根据其文件:

使用CacheBuilder生成的缓存不执行清除和逐出值 “自动”,或在值过期后立即,或 那种。相反,它在运行期间执行少量维护 写操作,或者在偶尔的读操作期间(如果写操作 稀罕的

原因如下:如果我们想执行缓存 持续维护,我们需要创建一个线程 操作将与用户操作竞争共享锁。 此外,某些环境限制线程的创建, 这将使CacheBuilder在该环境中不可用


要在过期时验证您的
onremovation
,请在第二次读取操作之前立即调用,它应该调用您的
onremovation

是否可以从删除侦听器重置过期超时并还原实体?如果是,如何进行?请参见
LoadingCache<String, Integer> ints = CacheBuilder.newBuilder()
            .maximumSize(10000)
            .expireAfterAccess(ACCESS_TIMEOUT, TimeUnit.MILLISECONDS)
            .removalListener(
                    new RemovalListener() {
                        //PROBLEM: THIS METHOD IS NEVER CALLED!!!
                        public void onRemoval(RemovalNotification notification) {
                            if (notification.getCause() == RemovalCause.EXPIRED) {
                                System.out.println("Value " + notification.getValue() + " has been expired");
                            } else {
                                System.out.println("Just removed for some reason");
                            }
                        }
                    }
            )
            .build(
                    new CacheLoader<String, Integer>() {
                        public Integer load(String key) throws Exception {
                            return new Integer(-1);
                        }
                    });
cache.put("key", 100);
Thread.sleep(ACCESS_TIMEOUT / 2);
System.out.println(cache.getIfPresent(key)); //returns 100
Thread.sleep(ACCESS_TIMEOUT * 5);
//CRUCIAL STRING: cache.put("key2", 200); //invoke removal listener
System.out.println(cache.getIfPresent(key)); //return null
//And again: the problem is that entity has been already expired, but removal listener isn't called untill I add new item to the cache.