2011-12-21 21 views
7

Đối với Lucene, chúng ta có một hộp công cụ tốt như Luke để xem, chẩn đoán, chỉnh sửa vv Chúng ta có công cụ tương tự (ít nhất là hiển thị) cho EhCache (khi chúng ta kích hoạt diskPersistent)?Viewer cho EhCache Index

Trả lời

0

Tôi không biết bất kỳ công cụ nào như vậy và định dạng tệp không thực sự được chỉ định hoặc được định nghĩa là API. Về cơ bản, EhCache viết các đối tượng được tuần tự hóa cho các tệp dữ liệu và chỉ mục. Bạn có thể đọc và hiển thị chúng nếu bạn truy cập trực tiếp vào các tệp. Để giúp bạn thực hiện, đây là chương trình làm điểm xuất phát:

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); 
    } 

    }