package dk.daoas.fulddaekning; import java.util.Map; import java.util.Queue; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ThreadPoolExecutor; import java.util.logging.Level; import java.util.logging.Logger; import dk.daoas.fulddaekning.BoundingBox.BoundingBoxException; public class Lookup { final static Logger logger = Logger.getLogger( Lookup.class.toString() ); int postnr; Database db; Adresse daekkedeAdresser[]; Queue queue; Map workers = new ConcurrentHashMap(); ThreadPoolExecutor threadPool; CyclicBarrier barrier; public Lookup(int postnr, Database db, ThreadPoolExecutor threadPool) { this.postnr = postnr; this.db = db; this.threadPool = threadPool; } public void doLookup() throws BoundingBoxException { logger.info("Starting for postnr=" + postnr); Statistik stat = new Statistik(); Constants consts = Constants.getInstance(); long start1 = System.currentTimeMillis(); long start2 = 0; barrier = new CyclicBarrier(LookupMain.max_workers + 1); try { logger.info("Henter _ikke_ daekkede adresser i " + postnr); queue = db.hentIkkedaekkedeAdresserCache(postnr); if (queue.size() == 0) { logger.info("Fandt ikke nogen _ikke_ daekkede adresser i " + postnr); return; } BoundingBox bbox = db.getBoundingbox(postnr); bbox.validateBbox(); logger.info("Bbox=" + bbox); bbox.adjustToMargin( consts.getKmMargin() ); logger.info("Bbox Adjusted=" + bbox); logger.info("Henter daekkede adresser i " + postnr); daekkedeAdresser = db.hentDaekkedeAdresserCache(bbox); stat.postnr = postnr; stat.antalDaekkede = daekkedeAdresser.length; stat.antalIkkeDaekkede = queue.size(); stat.totalDataset = stat.antalDaekkede * stat.antalIkkeDaekkede; logger.info("Starter beregning for " + postnr); start2 = System.currentTimeMillis(); for (int i =0; i < LookupMain.max_workers; i++) { LookupWorker worker = new LookupWorker(i, this, barrier); threadPool.submit(worker); } barrier.await(); db.saveBatch();//Save any unsaved rows } catch(Exception e) { logger.log(Level.WARNING, "Exception during lookup", e); if (e instanceof BoundingBoxException) { logger.severe( e.getMessage() ); System.exit(1); } } long now = System.currentTimeMillis(); stat.forbrugtTid = (now-start1); LookupMain.saveStatistics(stat); logger.info( stat.toString() ); logger.info("Done! elapsed=" + (now-start1) + "/" + (now-start2) + " postnr=" + postnr); } // Getters and setters /////////////////////////// public Database getDb() { return db; } public Adresse[] getDaekkedeAdresser() { return daekkedeAdresser; } public Queue getQueue() { return queue; } }