Google LoadingCache не может сохранить загруженный объект - PullRequest
0 голосов
/ 14 февраля 2019

Я использую контейнер Map в качестве значения в LoadingCache:

@Service
public class SlideCacheSpace {

    @Value("${value}")
    private int expire;

    private LoadingCache<Integer, ConcurrentHashMap<Point, Boolean>> loadingCache = CacheBuilder.newBuilder()
            .maximumSize(10000)
            .expireAfterWrite(expire, TimeUnit.SECONDS)
            .build(
                    new CacheLoader<Integer, ConcurrentHashMap<Point, Boolean>>() {
                        public ConcurrentHashMap<Point, Boolean> load(Integer key)  {
                            return new ConcurrentHashMap<>(5000);
                        }
                    });


    public boolean contains(int slug, Point point) {
        ConcurrentHashMap<Point, Boolean> points = loadingCache.getIfPresent(slug);
        if (points == null) {
            return false;
        }

        return points.contains(point);
    }

    public void put(int slug, Point point) throws ExecutionException {
        ConcurrentHashMap<Point, Boolean> points = loadingCache.get(slug);
        points.put(point, true);
    }

    public void delete(int slug) {
        loadingCache.invalidate(slug);
    }
}

Проблема в том, что мой метод slideCacheSpace.put(key, val) не влияет на LoadingCache.После вызова LoadCache ничего не загружается и остается пустым (проверяется размер во время отладки).Он остается пустым независимо от того, сколько раз вызывается метод put.Однако метод load в CacheLoader вызывается и каждый раз возвращается новый контейнер Map.Кажется, что LoadingCache просто игнорирует значение, которое он загружает.Метод contains никогда не возвращает true.

Мне интересно, как это могло произойти.

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Причина довольно неочевидна.Я создаю laodingCache во время загрузки класса, и внедрение значения еще не завершено.Таким образом, значение expire всегда равно 0. Простое исправление:

@Value("${value}")
private int expire;
private LoadingCache<Integer, ConcurrentHashMap<Point, Boolean>> loadingCache;


    @PostConstruct
    public void init() {
        loadingCache = CacheBuilder.newBuilder()
                .maximumSize(5000)
                .expireAfterAccess(expire, TimeUnit.SECONDS)
                .build(new CacheLoader<Integer, ConcurrentHashMap<Point, Boolean>>() {
                    @Override
                    public ConcurrentHashMap<Point, Boolean> load(Integer key)   {
                        return new ConcurrentHashMap<>(2500);
                    }
                });
    }

Внедрение значения должно работать так, как ожидалось.

0 голосов
/ 15 февраля 2019

Метод contains никогда не возвращает true, потому что класс Point неправильно реализует метод hashCode / equals.Или вы можете попробовать использовать String вместо Point, тогда содержимое вернет true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...