/[projects]/dao/FuldDaekningWorker/src/dk/daoas/fulddaekning/LookupWorker.java
ViewVC logotype

Annotation of /dao/FuldDaekningWorker/src/dk/daoas/fulddaekning/LookupWorker.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2263 - (hide annotations) (download)
Tue Feb 10 16:27:15 2015 UTC (9 years, 3 months ago) by torben
File size: 3249 byte(s)
1) Brug en CyclicBarrier til at kordinerer main + worker threads
2) Træk alle dækkede adresser ud til at starte med og lav in memory søgning ud fra BBox for at finde søge sættet over dækkede adresser
1 torben 2145 package dk.daoas.fulddaekning;
2    
3     import java.sql.SQLException;
4     import java.util.Queue;
5 torben 2263 import java.util.concurrent.BrokenBarrierException;
6     import java.util.concurrent.CyclicBarrier;
7 torben 2145 import java.util.logging.Level;
8     import java.util.logging.Logger;
9    
10     public class LookupWorker implements Runnable {
11 torben 2245 static class LookupResult {
12 torben 2229 double bedsteAfstand = 9999999.999;
13     Adresse bedsteAdr = null;
14     }
15    
16 torben 2231 Constants consts;
17    
18 torben 2145 Logger logger = Logger.getLogger( LookupWorker.class.getName() );
19    
20     int workerId;
21     Lookup lookup;
22 torben 2263 CyclicBarrier barrier;
23 torben 2145
24 torben 2263 public LookupWorker(int workerId, Lookup lookup, CyclicBarrier barrier) {
25 torben 2145 this.workerId = workerId;
26     this.lookup = lookup;
27 torben 2263 this.barrier = barrier;
28 torben 2231
29     consts = Constants.getInstance();
30 torben 2145 }
31    
32     @Override
33     public void run() {
34 torben 2200 Constants consts = Constants.getInstance();
35    
36 torben 2207 Adresse daekkede[] = lookup.getDaekkedeAdresser();
37 torben 2150 Queue<Adresse> queue = lookup.getQueue();
38 torben 2145 Database db = lookup.getDb();
39    
40     Adresse qAdresse;
41    
42    
43    
44     while ( (qAdresse = queue.poll()) != null) {
45     //logger.info("Worker " + workerId + ", analyzing " + qAdresse);
46    
47 torben 2229
48     LookupResult result = findBedsteAdresse(qAdresse, daekkede);
49 torben 2145
50 torben 2229 if (result.bedsteAdr == null && consts.doExtendedLookup() == true) {//hvis vi ikke fandt en adresse og vi må kigge på udvidet område
51 torben 2228 logger.info("Extended lookup for " + qAdresse);
52 torben 2229
53 torben 2241 result = findBedsteAdresse(qAdresse, LookupMain.alleDaekkedeAdresser);
54 torben 2228 }
55 torben 2145
56 torben 2228
57 torben 2229 if ( result.bedsteAdr != null) {
58 torben 2145
59 torben 2229 if (result.bedsteAfstand <= consts.getMaxDistance() ) { //Gem kun hvis distancen er under max_distance for distributøren
60 torben 2241 if (LookupMain.verbose == true) {
61 torben 2256 logger.fine("(" +workerId + ") Bedste: " + qAdresse + "==>" + result.bedsteAdr + " ::: " + result.bedsteAfstand );
62 torben 2145 }
63    
64     try {
65 torben 2229 db.gemResultat(qAdresse, result.bedsteAdr, result.bedsteAfstand);
66 torben 2145 } catch (SQLException e) {
67     logger.log(Level.WARNING, "Error saving result", e);
68     logger.warning("Shutting down");
69    
70     System.exit(0); //hvis at indsættelsen fejler skal vi afbryde med det samme
71     }
72     } else {
73 torben 2256 logger.fine("(" +workerId + ") For stor afstand " + qAdresse + " -> " + result.bedsteAfstand);
74 torben 2145 }
75     } else {
76 torben 2257 logger.fine("(" +workerId + ") Ingen match til " + qAdresse);
77 torben 2145 }
78    
79     }
80 torben 2263 try {
81     barrier.await();
82     } catch (BrokenBarrierException e) {
83     logger.log(Level.SEVERE, e.getMessage(), e);
84     System.exit(-1);
85     } catch(InterruptedException e) {
86     //Do nothing
87     }
88 torben 2145 }
89 torben 2229
90     LookupResult findBedsteAdresse(Adresse qAdresse, Adresse daekkede[]) {
91     LookupResult result = new LookupResult();
92    
93     for (int i=0; i<daekkede.length; i++) {
94     Adresse daekket = daekkede[i];
95 torben 2231
96     if (consts.doCheckHO() ) {
97     if (qAdresse.ho != daekket.ho) {
98     //logger.info("Forkert HO: " + qAdresse + " - >" + daekket); //Skal udkommenteres senere når HO check er valideret
99     continue;
100     }
101     }
102    
103 torben 2229 double afstand = Adresse.beregnAfstand(qAdresse, daekket);
104    
105     if (afstand < result.bedsteAfstand) {
106     result.bedsteAfstand = afstand;
107     result.bedsteAdr = daekket;
108     }
109     }
110     return result;
111    
112     }
113 torben 2145
114     }

  ViewVC Help
Powered by ViewVC 1.1.20