--- dao/FuldDaekningWorker/src/dk/daoas/fulddaekning/LookupWorker.java 2014/09/11 08:14:40 2200 +++ dao/FuldDaekningWorker/src/dk/daoas/fulddaekning/LookupWorker.java 2015/02/10 16:27:15 2263 @@ -1,27 +1,39 @@ package dk.daoas.fulddaekning; import java.sql.SQLException; -import java.util.ArrayList; import java.util.Queue; +import java.util.concurrent.BrokenBarrierException; +import java.util.concurrent.CyclicBarrier; import java.util.logging.Level; import java.util.logging.Logger; public class LookupWorker implements Runnable { + static class LookupResult { + double bedsteAfstand = 9999999.999; + Adresse bedsteAdr = null; + } + + Constants consts; + Logger logger = Logger.getLogger( LookupWorker.class.getName() ); int workerId; Lookup lookup; + CyclicBarrier barrier; - public LookupWorker(int workerId, Lookup lookup) { + public LookupWorker(int workerId, Lookup lookup, CyclicBarrier barrier) { this.workerId = workerId; this.lookup = lookup; + this.barrier = barrier; + + consts = Constants.getInstance(); } @Override public void run() { Constants consts = Constants.getInstance(); - ArrayList daekkede = lookup.getDaekkedeAdresser(); + Adresse daekkede[] = lookup.getDaekkedeAdresser(); Queue queue = lookup.getQueue(); Database db = lookup.getDb(); @@ -32,28 +44,25 @@ while ( (qAdresse = queue.poll()) != null) { //logger.info("Worker " + workerId + ", analyzing " + qAdresse); - double bedsteAfstand = 9999999.999; - Adresse bedsteAdr = null; - for (int i=0; i" + bedsteAdr + " ::: " + bedsteAfstand ); + if (result.bedsteAfstand <= consts.getMaxDistance() ) { //Gem kun hvis distancen er under max_distance for distributøren + if (LookupMain.verbose == true) { + logger.fine("(" +workerId + ") Bedste: " + qAdresse + "==>" + result.bedsteAdr + " ::: " + result.bedsteAfstand ); } try { - db.gemResultat(qAdresse, bedsteAdr, bedsteAfstand); + db.gemResultat(qAdresse, result.bedsteAdr, result.bedsteAfstand); } catch (SQLException e) { logger.log(Level.WARNING, "Error saving result", e); logger.warning("Shutting down"); @@ -61,16 +70,45 @@ System.exit(0); //hvis at indsættelsen fejler skal vi afbryde med det samme } } else { - logger.info("(" +workerId + ") For stor afstand " + qAdresse + " -> " + bedsteAfstand); + logger.fine("(" +workerId + ") For stor afstand " + qAdresse + " -> " + result.bedsteAfstand); } } else { - logger.warning("(" +workerId + ") Ingen match til " + qAdresse); + logger.fine("(" +workerId + ") Ingen match til " + qAdresse); } } + try { + barrier.await(); + } catch (BrokenBarrierException e) { + logger.log(Level.SEVERE, e.getMessage(), e); + System.exit(-1); + } catch(InterruptedException e) { + //Do nothing + } + } + + LookupResult findBedsteAdresse(Adresse qAdresse, Adresse daekkede[]) { + LookupResult result = new LookupResult(); - - lookup.shutdownWorker( workerId); + for (int i=0; i" + daekket); //Skal udkommenteres senere når HO check er valideret + continue; + } + } + + double afstand = Adresse.beregnAfstand(qAdresse, daekket); + + if (afstand < result.bedsteAfstand) { + result.bedsteAfstand = afstand; + result.bedsteAdr = daekket; + } + } + return result; + } }