package com.quickserverlab.quickcached; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import com.quickserverlab.quickcached.mem.MemoryWarningSystem; import org.quickserver.net.ServerHook; import org.quickserver.net.server.QuickServer; public class PrepareHook implements ServerHook { private static final Logger logger = Logger.getLogger(PrepareHook.class.getName()); private QuickServer quickserver; public String info() { return "Init Server Hook to setup cache."; } public void initHook(QuickServer quickserver) { this.quickserver = quickserver; } public boolean handleEvent(int event) { if(event==ServerHook.PRE_STARTUP) { Map config = quickserver.getConfig().getApplicationConfiguration(); try { CommandHandler.init(config); } catch(Exception e) { logger.log(Level.WARNING, "Error: "+e, e); } try { String maxSizeForKey = (String) config.get("MAX_SIZE_FOR_KEY"); if(maxSizeForKey!=null && maxSizeForKey.trim().length()!=0) { int maxSize = Integer.parseInt(maxSizeForKey); Data.setMaxSizeAllowedForKey(maxSize); } else { Data.setMaxSizeAllowedForKey(250); } String maxSizeForValueInMB = (String) config.get("MAX_SIZE_FOR_VALUE_IN_MB"); if(maxSizeForValueInMB!=null && maxSizeForValueInMB.trim().length()!=0) { long maxSize = Long.parseLong(maxSizeForValueInMB); Data.setMaxSizeAllowedForValue(maxSize*1024*1024); } else { Data.setMaxSizeAllowedForValue(5*1024*1024); } String charsetToUse = (String) config.get("CHARSET_TO_USE"); if(charsetToUse!=null && charsetToUse.trim().length()!=0) { HexUtil.setCharset(charsetToUse); } String enableStatsReportStr = (String) config.get("ENABLE_STATS_REPORT"); boolean enableStatsReport = false; String slowResponseThreshold = (String) config.get("SLOW_RESPONSE_LIMIT_MS_STATS"); if(slowResponseThreshold!=null) { CommandHandler.setSlowResponseThreshold(Long.parseLong(slowResponseThreshold)); } else { CommandHandler.setSlowResponseThreshold(500); } String slowResponseAvgRange = (String) config.get("SLOW_RESPONSE_AVG_MAX_SAMPLE_SIZE"); if(slowResponseAvgRange!=null) { CommandHandler.setSlowResponseAvgMaxSampleSize(Long.parseLong(slowResponseAvgRange)); } if("true".equals(enableStatsReportStr)) { enableStatsReport = true; } String statsReportWriteIntervalStr = (String) config.get("STATS_REPORT_WRITE_INTERVAL"); if(statsReportWriteIntervalStr!=null) { StatsReportGenerator.setWriteInterval(Integer.parseInt(statsReportWriteIntervalStr)); } String entriesToLog = (String) config.get("ENTRIES_TO_LOG"); if(entriesToLog!=null) { List entriesToLogList = Arrays.asList(entriesToLog.split(",")); entriesToLogList.remove(" "); StatsReportGenerator.setEntriesToLog(entriesToLogList); } if(enableStatsReport) { StatsReportGenerator.start(quickserver); } String gcCallOnLowMemoryPercentStr = (String) config.get("GC_CALL_ON_LOW_MEMORY_PERCENT"); if(gcCallOnLowMemoryPercentStr!=null && gcCallOnLowMemoryPercentStr.trim().length()!=0) { try { final int gcCallOnLowMemoryPercent = (int) ( Double.parseDouble(gcCallOnLowMemoryPercentStr) * 100); String pollingIntervalMin = (String) config.get( "GC_CALL_ON_LOW_MEMORY_POLLING_INTERVAL_MIN"); if(pollingIntervalMin==null) pollingIntervalMin = "1"; final int gcCallOnLowMemoryPollingIntervalMin = Integer.parseInt(pollingIntervalMin); Thread t = new Thread() { public void run() { logger.info("Started.."); int gcCallOnLowMemoryPollingInterval = gcCallOnLowMemoryPollingIntervalMin * 1000 * 60; while(true) { try { sleep(gcCallOnLowMemoryPollingInterval); } catch (InterruptedException ex) { Logger.getLogger(StatsReportGenerator.class.getName()).log( Level.WARNING, "Error", ex); break; } int permemuse = MemoryWarningSystem.getMemUsedPercentage(); if(permemuse > gcCallOnLowMemoryPercent) { logger.log(Level.INFO, "MemUsedPercentage: {0}, calling gc..", permemuse); System.gc(); CommandHandler.gcCalls++; } } logger.info("Done"); } }; t.setName("GCCallOnLowMemoryPolling-Thread"); t.setDaemon(true); t.start(); } catch(Exception er) { logger.log(Level.WARNING, "Error: "+er, er); er.printStackTrace(); } } } catch(Exception e) { logger.log(Level.WARNING, "Error: "+e, e); e.printStackTrace(); } return true; } return false; } }