我有一个问题,我的番石榴缓存未过期。我将代码留在下面。缓存仅过期一次,我再次写入缓存。但是从我从javadoc那里获得的关于时间到期的信息来看,它应该在写入后到期x timeunit。任何帮助,将不胜感激。

    private static final Cache<UUID, RainbowWrapper> RAINBOWS = CacheBuilder.newBuilder()
        .removalListener(new RemovalListener<UUID, RainbowWrapper>() {
            @Override
            public void onRemoval(RemovalNotification<UUID, RainbowWrapper> notification) {
                CoreAPI.debug("Removing rainbow: " + notification.getKey().toString());
                RainbowWrapper wrapper = notification.getValue();
                for (UUID uuid : wrapper.getUuids()) {
                    CoreAPI.debug("Removing entity: " + uuid);
                    Bukkit.getWorlds().get(0).getEntitiesByClasses(Item.class, ArmorStand.class).stream()
                            .filter(entity -> entity.getUniqueId().equals(uuid))
                            .forEach(org.bukkit.entity.Entity::remove);
                }
            }
        }).expireAfterWrite(FADE_TIME, TimeUnit.SECONDS).build();

最佳答案

这在Guaa Wiki上When does Cleanup happen?下进行了解释

基本上,只要不调用缓存的任何方法,就什么也不会发生,因为如果不为缓存创建自己的线程是不可能的,这通常是不希望的,因此Guava缓存不会自动完成。

如果您仅对缓存具有读取访问权限,则调用删除监听程序可能还需要一段时间,因为Guava认为对缓存的读取访问应该是快速的,因此尝试为读取访问执行尽可能少的工作,这通常意味着它不调用移除监听器。只有在一段时间内没有写访问权限时,缓存才会在读访问权限时进行清理和呼叫删除侦听器。

请注意,这仍然意味着过期功能正在工作:过期的条目不会从任何缓存方法中返回。删除监听器的调用可能比您预期的晚。

如果您想强制及时删除通知,则应定期调用Cache.cleanUp()(例如,从单独的线程中)。

如果对您而言重要的是在时间流逝后尽快获得通知,那么我将简单地使用ScheduledExecutorService并向其提交任务,而不是依赖于缓存及其删除通知。

关于java - 使用定时过期时,x时间单位后Guava缓存未过期,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31489197/

10-12 04:15