package dk.daoas.fulddaekning; import java.io.File; import java.io.FileReader; import java.util.List; import java.util.logging.FileHandler; import java.util.logging.Logger; import java.util.logging.SimpleFormatter; import java.util.concurrent.*; public class LookupMain { static final String CONFIG_FILENAME = "fulddaekning.properties"; static boolean rename_tables; static SafeProperties conf; static int max_workers; static boolean verbose; static String distributor; final static Logger logger = Logger.getLogger( LookupMain.class.toString() ); static Statistik flestDaekkede = new Statistik(); static Statistik flestIkkeDaekkede = new Statistik(); static Statistik mestBrugteTid = new Statistik(); static Statistik stoersteDataset = new Statistik(); static Adresse[] alleDaekkedeAdresser; static ThreadPoolExecutor threadPool; private static void setupThreadPool() { threadPool = (ThreadPoolExecutor) Executors.newFixedThreadPool(max_workers, new ThreadFactory() { @Override public Thread newThread(Runnable r) { return new Thread(r, "lookupWorker"); } }); } public static void main(String[] args) throws Exception { //Setup j.u.l Logger Logger root = Logger.getLogger(""); FileHandler fhandler = new FileHandler("fulddaekning.log"); // Ingen max størrelse, ingen rotation og ingen append fhandler.setFormatter( new SimpleFormatter() ); root.addHandler( fhandler ); File confFile = new File( CONFIG_FILENAME ); if (! confFile.exists() ) { logger.warning("Config file not found: " + CONFIG_FILENAME); System.exit(1); } conf = new SafeProperties(); conf.load( new FileReader(confFile) ); max_workers = Integer.parseInt( conf.getSafeProperty("MAX_WORKERS") ); if (max_workers <= 0) { logger.info("!!! AUTO-DETECT MAX_WORKERS !!!"); int cores = Runtime.getRuntime().availableProcessors(); cores -= 1;//Efterlad 1 core/cpu i reserve til systemet max_workers = Math.max(1, cores); //Dog skal der som minimum være 1 core til beregning } logger.info("Starting with MAX_WORKERS:" + max_workers); setupThreadPool(); verbose = Boolean.parseBoolean( conf.getSafeProperty("VERBOSE") ); logger.info("Starting with VERBOSE:" + verbose); rename_tables = Boolean.parseBoolean( conf.getSafeProperty("RENAMETABLES") ); logger.info("Starting with RENAMETABLES:" + rename_tables); distributor = conf.getSafeProperty("DISTRIBUTOR"); distributor = distributor.toUpperCase(); logger.info("Starting for DISTRIBUTOR:" + distributor); Constants.init(distributor); Constants consts = Constants.getInstance(); Database db = new Database(conf); boolean testRun= false; long start = System.currentTimeMillis(); if (testRun == false) { logger.info("Finder postnumre"); List postnumre = db.hentPostnumre(); // Først validerer vi BBox på alle postnummre, for at undgå fuldt stop midt i beregningen for(String postnr : postnumre) { // logger.info("Validerer BBox for " + postnr); BoundingBox bbox = db.getBoundingbox(postnr); bbox.validateBbox(); } if (consts.doExtendedLookup()) { logger.info("Henter alle daekkede adresser"); alleDaekkedeAdresser = db.hentAlleDaekkedeAdresser(); logger.info( "AlleDaekkedeAdresser.length=" + alleDaekkedeAdresser.length); } //pre-check er ok - reset tmp tabel og start søgningen db.resetResultTable(); for(String postnr : postnumre) { Lookup lookup = new Lookup(postnr, db, threadPool); lookup.doLookup(); } if (rename_tables) { db.renameResultTables(); } else { logger.info( "Rename tables is disabled !!!" ); } } else { /// Test db.resetResultTable(); if (consts.doExtendedLookup()) { alleDaekkedeAdresser = db.hentAlleDaekkedeAdresser(); logger.info( "AlleDaekkedeAdresser.length=" + alleDaekkedeAdresser.length); } Lookup lookup = new Lookup("458x", db, threadPool); lookup.doLookup(); } long now = System.currentTimeMillis(); long elapsed = now - start ; logger.info("Mest brugte tid: " + mestBrugteTid); logger.info("Flest Ikke-dækkede, " + flestIkkeDaekkede); logger.info("Flest Dækkede, " + flestDaekkede); logger.info("Største Dataset, " + stoersteDataset); logger.info("Fuld load done : " + formatMilliSeconds(elapsed) ); } public static void saveStatistics(Statistik stat) { if (stat.antalDaekkede > flestDaekkede.antalDaekkede) { flestDaekkede = stat; } if (stat.antalIkkeDaekkede > flestIkkeDaekkede.antalIkkeDaekkede) { flestIkkeDaekkede = stat; } if (stat.totalDataset > mestBrugteTid.totalDataset) { stoersteDataset = stat; } if (stat.forbrugtTid > mestBrugteTid.forbrugtTid) { mestBrugteTid = stat; } } static String formatMilliSeconds(long milliseconds) { int mseconds = (int) milliseconds % 1000; int seconds = (int) (milliseconds / 1000) % 60 ; int minutes = (int) ((milliseconds / (1000*60)) % 60); int hours = (int) ((milliseconds / (1000*60*60)) % 24); return String.format("%02d:%02d:%02d.%03d", hours, minutes, seconds, mseconds); } }