package dk.daoas.adressevedligehold.afstandandenrute; import java.sql.Connection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Queue; import java.util.Set; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.FileHandler; import java.util.logging.Logger; import java.util.logging.SimpleFormatter; import ags.utils.dataStructures.trees.thirdGenKD.KdTree; import dk.daoas.adressevedligehold.ServiceConfig; import dk.daoas.adressevedligehold.beans.Address; import dk.daoas.adressevedligehold.db.DBConnection; import dk.daoas.adressevedligehold.tasks.Task; import dk.daoas.adressevedligehold.util.HttpUtil; public class AfstandAndenRuteTask extends Task { final Logger logger = Logger.getLogger( AfstandAndenRuteTask.class.toString() ); final boolean verbose = false;// static boolean test_mode; String distributor; int antalIkkeDaekkede = -1; AtomicInteger antalBeregnet = new AtomicInteger(); ThreadPoolExecutor threadPool; public AfstandAndenRuteTask(String distributor) { this.distributor = distributor; } @Override protected void taskRun() 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 ); Constants.init(distributor); Constants consts = Constants.getInstance(); int max_workers = ServiceConfig.getInstance().maxWorkers; 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 } if (test_mode) { max_workers = 1; } logger.info("Starting with MAX_WORKERS:" + max_workers); setupThreadPool(max_workers); try (Connection conn = DBConnection.getConnection() ) { Database db = new Database(conn); Queue
ikkeDaekkede = db.hentAlleIkkedaekkedeAdresser(consts.getMinPostnr(), consts.getMaxPostnr() ); antalIkkeDaekkede = ikkeDaekkede.size(); logger.info("Antal ikke-daekkede: " + antalIkkeDaekkede ); boolean testRun= false; AtomicInteger antalFundne = new AtomicInteger(0); long beregnStart =0; long start = System.currentTimeMillis(); int antalDaekkedeAdresser = -1; if (testRun == false) { logger.info("Finder postnumre"); Set postnumre = db.hentPostnumreCache(); // Først validerer vi BBox på alle postnummre, for at undgå fuldt stop midt i beregningen for(short postnr : postnumre) { // logger.info("Validerer BBox for " + postnr); BoundingBox bbox = db.getBoundingbox(postnr); bbox.validateBbox(); } logger.info("Henter alle daekkede adresser"); antalDaekkedeAdresser = db.hentAlleDaekkedeAdresser(distributor); logger.info( "AlleDaekkedeAdresser.length=" + antalDaekkedeAdresser ); Map> addrHoList = db.getDaekkedeAdresserHO(); Map> hoTrees = new HashMap>(); for ( Map.Entry> entry : addrHoList.entrySet() ) { short ho = entry.getKey(); List
geopoints = entry.getValue(); logger.info("Opbygger KDTree for " + ho + " - antal=" + geopoints.size() ); int bucketSize = 96*12; KdTree
addressTree = new KdTree
( 3, bucketSize ); for(Address a: geopoints) { addressTree.addPoint(a.xyz, a); } hoTrees.put(ho, addressTree); } db.resetResultTable(); beregnStart = System.currentTimeMillis(); logger.info("Starter beregning"); //pre-check er ok - reset tmp tabel og start søgningen CyclicBarrier barrier = new CyclicBarrier(max_workers + 1); for (int i=0; i