--- 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");
}
}