--- dao/DaoAdresseVedligehold/src/main/java/dk/daoas/adressevedligehold/afstandandenrute/LookupWorker.java 2016/01/30 19:31:24 2888 +++ dao/DaoAdresseVedligehold/src/main/java/dk/daoas/adressevedligehold/afstandandenrute/LookupWorker.java 2016/02/03 18:51:36 2904 @@ -4,11 +4,9 @@ import java.util.ArrayList; import java.util.Map; import java.util.Queue; -import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; -import java.util.logging.Logger; import ags.utils.dataStructures.MaxHeap; import ags.utils.dataStructures.trees.thirdGenKD.DistanceFunction; @@ -17,13 +15,14 @@ import dk.daoas.adressevedligehold.ServiceConfig; import dk.daoas.adressevedligehold.beans.Address; import dk.daoas.adressevedligehold.tasks.Task; +import dk.daoas.adressevedligehold.tasks.TaskLogger; public class LookupWorker implements Runnable { static final int MAX_RESULTS = 99; - final static Logger logger = Logger.getLogger( LookupWorker.class.toString() ); + private TaskLogger logger = TaskLogger.getInstance(); OSRMHelper osrmHelper = new OSRMHelper(); @@ -34,6 +33,7 @@ Constants consts; AtomicInteger antalFundne; + AtomicInteger antalBeregnet; int workerID; boolean verbose; @@ -48,6 +48,7 @@ Queue
ikkeDaekkede, Map> hoTrees, AtomicInteger antalFundne, + AtomicInteger antalBeregnet, Database db, boolean verbose, Constants consts) { @@ -58,6 +59,7 @@ this.ikkeDaekkede = ikkeDaekkede; this.hoTrees = hoTrees; this.antalFundne = antalFundne; + this.antalBeregnet = antalBeregnet; this.db = db; this.verbose = verbose; this.consts = consts; @@ -67,16 +69,16 @@ @Override public void run() { - System.out.println( "Worker/" + workerID + " starting"); + logger.info( "Worker/" + workerID + " starting"); ServiceConfig conf = ServiceConfig.getInstance(); - try { + try (BarrierMarker marker = new BarrierMarker() ) { while ( ! ikkeDaekkede.isEmpty() ) { if (task.isAborted()) { - System.out.println( "Worker/" + workerID + " aborting"); - return; + logger.info( "Worker/" + workerID + " aborting"); + break; } @@ -89,7 +91,7 @@ //Collection
res = addressTree.nearestNeighbourSearch(MAX_RESULTS, qAddress); int size = res.size(); if (size > MAX_RESULTS ) { - System.out.println("Returnerede mere end MAX_RESULTS> " + res.size() ); + logger.info("Returnerede mere end MAX_RESULTS> " + res.size() ); throw new Exception("Returnerede mere end MAX_RESULTS> " + res.size()); } @@ -133,16 +135,17 @@ try { db.gemResultat(qAddress, bedsteAdr, bedsteAfstand); } catch (SQLException e) { - logger.log(Level.WARNING, "Error saving result", e); + logger.warning("Error saving result", e); logger.warning("Shutting down"); throw e; // rethrow } } else { if (verbose == true) { - System.out.println("For stor afstand: " + qAddress + " > " + bedsteAfstand); + logger.fine("For stor afstand: " + qAddress + " > " + bedsteAfstand); } } - + + antalBeregnet.incrementAndGet(); } } catch (Exception e) { @@ -151,15 +154,27 @@ } + - try { - logger.info( "Worker/" + workerID + " afventer barrier"); - barrier.await(); - } catch (Exception e) { - logger.log(Level.SEVERE, e.getMessage(), e); + logger.info( "Worker/" + workerID + " stopping"); + } + + + /** + * Makes sure the barrier is touched correctly no matter how the the current code block is exited. + * @author thn + * + */ + public class BarrierMarker implements AutoCloseable { + @Override + public void close() { + try { + logger.info( "Worker/" + workerID + " afventer barrier"); + barrier.await(); + } catch (Exception e) { + logger.log(Level.SEVERE, e.getMessage(), e); + } } - - System.out.println( "Worker/" + workerID + " stopping"); } }