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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2263 - (show 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 package dk.daoas.fulddaekning;
2
3 import java.sql.SQLException;
4 import java.util.Queue;
5 import java.util.concurrent.BrokenBarrierException;
6 import java.util.concurrent.CyclicBarrier;
7 import java.util.logging.Level;
8 import java.util.logging.Logger;
9
10 public class LookupWorker implements Runnable {
11 static class LookupResult {
12 double bedsteAfstand = 9999999.999;
13 Adresse bedsteAdr = null;
14 }
15
16 Constants consts;
17
18 Logger logger = Logger.getLogger( LookupWorker.class.getName() );
19
20 int workerId;
21 Lookup lookup;
22 CyclicBarrier barrier;
23
24 public LookupWorker(int workerId, Lookup lookup, CyclicBarrier barrier) {
25 this.workerId = workerId;
26 this.lookup = lookup;
27 this.barrier = barrier;
28
29 consts = Constants.getInstance();
30 }
31
32 @Override
33 public void run() {
34 Constants consts = Constants.getInstance();
35
36 Adresse daekkede[] = lookup.getDaekkedeAdresser();
37 Queue<Adresse> queue = lookup.getQueue();
38 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
48 LookupResult result = findBedsteAdresse(qAdresse, daekkede);
49
50 if (result.bedsteAdr == null && consts.doExtendedLookup() == true) {//hvis vi ikke fandt en adresse og vi må kigge på udvidet område
51 logger.info("Extended lookup for " + qAdresse);
52
53 result = findBedsteAdresse(qAdresse, LookupMain.alleDaekkedeAdresser);
54 }
55
56
57 if ( result.bedsteAdr != null) {
58
59 if (result.bedsteAfstand <= consts.getMaxDistance() ) { //Gem kun hvis distancen er under max_distance for distributøren
60 if (LookupMain.verbose == true) {
61 logger.fine("(" +workerId + ") Bedste: " + qAdresse + "==>" + result.bedsteAdr + " ::: " + result.bedsteAfstand );
62 }
63
64 try {
65 db.gemResultat(qAdresse, result.bedsteAdr, result.bedsteAfstand);
66 } 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 logger.fine("(" +workerId + ") For stor afstand " + qAdresse + " -> " + result.bedsteAfstand);
74 }
75 } else {
76 logger.fine("(" +workerId + ") Ingen match til " + qAdresse);
77 }
78
79 }
80 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 }
89
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
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 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
114 }

  ViewVC Help
Powered by ViewVC 1.1.20