Я использую контейнер 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.
Мне интересно, как это могло произойти.