Проведя некоторое время с отладчиком, я думаю, что у меня есть ответ для OP.
Проблема (по крайней мере из того, что я видел) связана с некластеризованными файлами дискового кэша и тем, как они возвращаются обратно. В файле net.sf.ehcache.store.compound.factories.DiskPersistentStorageFactory.java, метод:
public DiskPersistentStorageFactory(Ehcache cache, String diskPath) {
super(getDataFile(diskPath, cache), cache.getCacheConfiguration().getDiskExpiryThreadIntervalSeconds(),
cache.getCacheConfiguration().getDiskSpoolBufferSizeMB(), cache.getCacheEventNotificationService(), false);
indexFile = new File(getDataFile().getParentFile(), getIndexFileName(cache));
flushTask = new IndexWriteTask(indexFile, cache.getCacheConfiguration().isClearOnFlush());
if (!getDataFile().exists() || (getDataFile().length() == 0)) {
LOG.debug("Matching data file missing (or empty) for index file. Deleting index file " + indexFile);
indexFile.delete();
} else if (getDataFile().exists() && indexFile.exists()) {
if (getDataFile().lastModified() > (indexFile.lastModified() + TimeUnit.SECONDS.toMillis(1))) {
LOG.warn("The index for data file {} is out of date, probably due to an unclean shutdown. "
+ "Deleting index file {}", getDataFile(), indexFile);
indexFile.delete();
}
}
diskCapacity = cache.getCacheConfiguration().getMaxElementsOnDisk();
memoryCapacity = cache.getCacheConfiguration().getMaxElementsInMemory();
memoryPolicy = determineEvictionPolicy(cache.getCacheConfiguration());
}
проверяет временные метки в файлах данных. Проблема, с которой я сталкиваюсь, заключается в том, что независимо от того, как я заканчиваю работу с кэшем / менеджером, файлы никогда не синхронизируются должным образом. Мой быстрый и грязный обходной путь состоял в том, чтобы отрегулировать время файла данных, чтобы оно было только после отметки времени в файле индекса:
File index = new File( path, name + ".index" );
File data = new File( path, name + ".data" );
data.setLastModified( index.lastModified() + 1 );
Конечно, это не элегантно, но удовлетворяет моим потребностям, так как наш проект использует кластерные кэши, и это позволяет мне отлаживать автономно с постоянным кэшем ... и без необходимости фактически запускать Terracotta локально.
Одно предостережение в том, что для некластеризованных кэшей мне необходимо выполнять flush () после каждого put () и remove (), чтобы сохранить образ диска свежим, особенно при отладке из-за отсутствия поддержки выключения, когда вы просто "потяните за вилку".