package proj.zoie.perf.servlet; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ZoiePerfServlet extends HttpServlet { private static final long serialVersionUID = 1L; private File _dataDir = null; private Map<String, RandomAccessFile> _readerMap = new HashMap<String, RandomAccessFile>(); private Map<String, File> _fileMap = new HashMap<String, File>(); public ZoiePerfServlet(File dataDir) { _dataDir = dataDir; if (!_dataDir.exists()) { _dataDir.mkdirs(); } _fileMap.put("searchTimer", new File(_dataDir, "searchTimer.csv")); _fileMap.put("consumeRateCount", new File(_dataDir, "consumeRateCount.csv")); _fileMap.put("consumeRateMB", new File(_dataDir, "consumeRateMB.csv")); _fileMap.put("indexLatency", new File(_dataDir, "indexLatency.csv")); } @Override protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { String type = req.getParameter("type"); File file = _fileMap.get(type); if (file == null) { throw new ServletException("invalid: " + type); } RandomAccessFile reader = _readerMap.get(type); if (reader == null) { reader = new RandomAccessFile(file, "r"); _readerMap.put(type, reader); } long offset = 0; try { offset = Long.parseLong(req.getParameter("offset")); } catch (Exception e) { offset = 0L; } if (offset < reader.length()) { reader.seek(offset); while (true) { String line = reader.readLine(); if (line == null) { res.getWriter().print(""); return; } if (line.trim().startsWith("#")) continue; long newOffset = reader.getFilePointer(); res.getWriter().print(newOffset + ":" + line); return; } } } @Override public void destroy() { for (RandomAccessFile reader : _readerMap.values()) { try { reader.close(); } catch (Exception e) { e.printStackTrace(); } } } }