Средство просмотра для индекса EhCache - PullRequest
7 голосов
/ 21 декабря 2011

Для Lucene у нас есть хороший набор инструментов, такой как Luke для просмотра, диагностики, редактирования и т. Д. Есть ли у нас аналогичный инструмент (по крайней мере, для отображения) для EhCache (когда мы включаем diskPersistent)?

1 Ответ

0 голосов
/ 29 ноября 2012

Я не знаю ни одного такого инструмента, и формат файла на самом деле не указан или определен как API.По сути, EhCache записывает сериализованные объекты в файлы данных и индексов.Вы можете читать и отображать их, если вы обращаетесь к файлам напрямую.Чтобы начать, вот программа в качестве отправной точки:

  import java.io.ByteArrayInputStream;
  import java.io.EOFException;
  import java.io.FileInputStream;
  import java.io.ObjectInputStream;
  import java.io.RandomAccessFile;
  import java.lang.reflect.Field;

  import net.sf.ehcache.Element;
  import net.sf.ehcache.store.disk.DiskStorageFactory.DiskMarker;

  public class EhcacheViewer
  {

     public static void main( String[] args ) throws Exception
     {
        final RandomAccessFile data = new RandomAccessFile( "cache/my-cache.data", "r" );
        ObjectInputStream ois = new ObjectInputStream( new FileInputStream( "cache/my-cache.index" ) );
        try
        {
           while( true )
           {
              Object key = ois.readObject();
              DiskMarker marker = (DiskMarker) ois.readObject();
              long pos = getPosition( marker );
              int size = marker.getSize();
              data.seek( pos );
              byte[] value = new byte[size];
              data.readFully( value );
              ObjectInputStream ois2 = new ObjectInputStream( new ByteArrayInputStream( value ) );
              Element element = (Element) ois2.readObject();
              System.out.println( "Element: " + element );
           }
        }
        catch( EOFException e )
        {
           // ...
        }
        ois.close();
        data.close();
     }

     private static long getPosition( DiskMarker marker ) throws Exception
     {
        Field field = marker.getClass().getDeclaredField( "position" );
        field.setAccessible( true );
        return (Long) field.get( marker );
     }

  }
...