--- dao/DaoAdresseVedligehold/src/main/java/dk/daoas/adressevedligehold/afstandandenrute/AfstandAndenRuteTask.java 2016/02/03 18:45:33 2903
+++ dao/DaoAdresseVedligehold/src/main/java/dk/daoas/adressevedligehold/afstandandenrute/AfstandAndenRuteTask.java 2016/03/29 20:36:40 2994
@@ -7,13 +7,13 @@
import java.util.Queue;
import java.util.Set;
import java.util.concurrent.CyclicBarrier;
+import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.atomic.AtomicInteger;
import ags.utils.dataStructures.trees.thirdGenKD.KdTree;
-import dk.daoas.adressevedligehold.ReloadHelper;
+import dk.daoas.adressevedligehold.ReloadTask;
import dk.daoas.adressevedligehold.ServiceConfig;
import dk.daoas.adressevedligehold.beans.Address;
import dk.daoas.adressevedligehold.db.DBConnection;
@@ -23,44 +23,51 @@
public class AfstandAndenRuteTask extends Task {
+
private TaskLogger logger = TaskLogger.getInstance();
- final boolean verbose = false;//
+ final static boolean VERBOSE = false;//
+
+ public final static String INCREMENTAL = "INCREMENTAL";
+ public final static String FULL = "FULL";
static boolean test_mode;
String distributor;
- int antalIkkeDaekkede = -1;
+ int antalIkkeDaekkede = 0;
AtomicInteger antalBeregnet = new AtomicInteger();
- ThreadPoolExecutor threadPool;
+ ExecutorService threadPool;
+ boolean isIncremental;
- public AfstandAndenRuteTask(String distributor) {
+ public AfstandAndenRuteTask(String distributor, String type) {
this.distributor = distributor;
+
+ type = type.toUpperCase();
+ switch(type) {
+ case FULL:
+ isIncremental = false;
+ break;
+ case INCREMENTAL:
+ isIncremental = true;
+ break;
+ default:
+ throw new RuntimeException("Unknown type" + type);
+ }
}
@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();
@@ -78,127 +85,144 @@
max_workers = 1;
}
logger.info("Starting with MAX_WORKERS:" + max_workers);
- setupThreadPool(max_workers);
+ threadPool = Executors.newFixedThreadPool(max_workers, new WorkerThreadFactory() );
+
+ logger.info("Starting with INCREMENTAL:" + isIncremental);
- 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);
+ AtomicInteger antalFundne = new AtomicInteger(0);
- long beregnStart =0;
- long start = System.currentTimeMillis();
- int antalDaekkedeAdresser = -1;
+ long start = System.currentTimeMillis();
+ AtomicInteger antalDaekkedeAdresser = new AtomicInteger(-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();
- }
+ // MAIN RUN START
+ logger.info("======================================================================");
+
+ mainRun(consts, isIncremental, "ruteMa", max_workers, antalFundne, antalDaekkedeAdresser);
+
+ logger.info("======================================================================");
+
+ mainRun(consts, true, "ruteLo", max_workers, antalFundne, antalDaekkedeAdresser);
+
+ logger.info("======================================================================");
+
+ mainRun(consts, true, "ruteSo", max_workers, antalFundne, antalDaekkedeAdresser);
+
+ logger.info("======================================================================");
- logger.info("Henter alle daekkede adresser");
- antalDaekkedeAdresser = db.hentAlleDaekkedeAdresser(distributor);
- logger.info( "AlleDaekkedeAdresser.length=" + antalDaekkedeAdresser );
+ // END OF MAIN run
+
+ threadPool.shutdown(); //Calc is done now
+ threadPool = null;//release early for GC
+
- Map> addrHoList = db.getDaekkedeAdresserHO();
+ manager.submitTask( new ReloadTask("AfstandAndenRute/" + distributor) );
+
- Map> hoTrees = new HashMap>();
+ long now = System.currentTimeMillis();
+ long elapsed = now - start ;
- 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 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");
+ int tmpAntalDaekkede = db.hentAlleDaekkedeAdresser(distributor);
+ antalDaekkedeAdresser.set(tmpAntalDaekkede);
+ 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();
+
-
-
+ 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