/[projects]/dao/DaoAdresseVedligehold/src/main/java/dk/daoas/adressevedligehold/afstandandenrute/LookupWorker.java
ViewVC logotype

Contents of /dao/DaoAdresseVedligehold/src/main/java/dk/daoas/adressevedligehold/afstandandenrute/LookupWorker.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2887 - (show annotations) (download)
Sat Jan 30 19:27:16 2016 UTC (8 years, 3 months ago) by torben
File size: 4775 byte(s)
replace system.exit with exceptions
1 package dk.daoas.adressevedligehold.afstandandenrute;
2
3 import java.sql.SQLException;
4 import java.util.ArrayList;
5 import java.util.Map;
6 import java.util.Queue;
7 import java.util.concurrent.BrokenBarrierException;
8 import java.util.concurrent.CyclicBarrier;
9 import java.util.concurrent.atomic.AtomicInteger;
10 import java.util.logging.Level;
11 import java.util.logging.Logger;
12
13 import ags.utils.dataStructures.MaxHeap;
14 import ags.utils.dataStructures.trees.thirdGenKD.DistanceFunction;
15 import ags.utils.dataStructures.trees.thirdGenKD.KdTree;
16 import ags.utils.dataStructures.trees.thirdGenKD.SquareEuclideanDistanceFunction;
17 import dk.daoas.adressevedligehold.ServiceConfig;
18 import dk.daoas.adressevedligehold.beans.Address;
19 import dk.daoas.adressevedligehold.tasks.Task;
20
21 public class LookupWorker implements Runnable {
22
23 static final int MAX_RESULTS = 99;
24
25
26 final static Logger logger = Logger.getLogger( LookupWorker.class.toString() );
27
28 OSRMHelper osrmHelper = new OSRMHelper();
29
30 CyclicBarrier barrier;
31 Queue<Address> ikkeDaekkede;
32 Map<Short, KdTree<Address>> hoTrees;
33 Database db;
34 Constants consts;
35
36 AtomicInteger antalFundne;
37
38 int workerID;
39 boolean verbose;
40
41 Task task;
42
43 DistanceFunction dist = new SquareEuclideanDistanceFunction();
44
45 public LookupWorker(int workerID,
46 Task task,
47 CyclicBarrier barrier,
48 Queue<Address> ikkeDaekkede,
49 Map<Short, KdTree<Address>> hoTrees,
50 AtomicInteger antalFundne,
51 Database db,
52 boolean verbose,
53 Constants consts) {
54
55 this.workerID = workerID;
56 this.task = task;
57 this.barrier = barrier;
58 this.ikkeDaekkede = ikkeDaekkede;
59 this.hoTrees = hoTrees;
60 this.antalFundne = antalFundne;
61 this.db = db;
62 this.verbose = verbose;
63 this.consts = consts;
64
65 }
66
67
68 @Override
69 public void run() {
70 System.out.println( "Worker/" + workerID + " starting");
71
72 ServiceConfig conf = ServiceConfig.getInstance();
73
74 try {
75 while ( ! ikkeDaekkede.isEmpty() ) {
76
77 if (task.isAborted()) {
78 System.out.println( "Worker/" + workerID + " aborting");
79 return;
80 }
81
82
83 Address qAddress = ikkeDaekkede.remove();
84
85 short ho = qAddress.ho;
86 KdTree<Address> addressTree = hoTrees.get(ho);
87
88 MaxHeap<Address> res = addressTree.findNearestNeighbors(qAddress.xyz, MAX_RESULTS, dist);
89 //Collection<Address> res = addressTree.nearestNeighbourSearch(MAX_RESULTS, qAddress);
90 int size = res.size();
91 if (size > MAX_RESULTS ) {
92 System.out.println("Returnerede mere end MAX_RESULTS> " + res.size() );
93 throw new Exception("Returnerede mere end MAX_RESULTS> " + res.size());
94 }
95
96 ArrayList<Address> adrList = new ArrayList<Address>();
97
98 for (int i=0; i<size; i++) {
99 Address a = res.getMax();
100 adrList.add(a);
101 res.removeMax();
102 }
103 Address bedsteAdr = adrList.get(size-1); //da det er en max-heap er det elementet med størst distance der er først og dermed den sidste der er tættest
104 double bedsteAfstand = GeoPointHelper.beregnAfstand(qAddress, bedsteAdr);
105
106
107 if ( conf.useOsrm == true) {
108 //Hvis at den er inden for afstand, så prøver vi at lave findNærmste på vej distancen
109 if (bedsteAfstand <= consts.getMaxDistance()) {
110
111 Address bedsteAdr2 = osrmHelper.getNearestTableHttp(qAddress, adrList);
112
113 if (bedsteAdr2 != null) {
114 bedsteAdr = bedsteAdr2;
115 bedsteAfstand = GeoPointHelper.beregnAfstand(qAddress, bedsteAdr);
116 } else {
117 logger.info("OSRM returned null for " + qAddress);
118 }
119 }
120 }
121
122
123
124
125
126 if (bedsteAfstand <= consts.getMaxDistance() ) { //Gem kun hvis distancen er under max_distance for distributøren
127 if (verbose == true) {
128 logger.fine("(" +workerID + ") Bedste: " + qAddress + "==>" + bedsteAdr + " ::: " + bedsteAfstand );
129 }
130
131 antalFundne.incrementAndGet();
132
133 try {
134 db.gemResultat(qAddress, bedsteAdr, bedsteAfstand);
135 } catch (SQLException e) {
136 logger.log(Level.WARNING, "Error saving result", e);
137 logger.warning("Shutting down");
138 throw e; // rethrow
139 }
140 } else {
141 if (verbose == true) {
142 System.out.println("For stor afstand: " + qAddress + " > " + bedsteAfstand);
143 }
144 }
145
146 }
147
148 } catch (Exception e) {
149 logger.log( Level.SEVERE, "Worker/" + workerID, e);
150 task.doAbort();
151 }
152
153
154
155 try {
156 logger.info( "Worker/" + workerID + " afventer barrier");
157 barrier.await();
158 } catch (BrokenBarrierException e) {
159 logger.log(Level.SEVERE, e.getMessage(), e);
160 System.exit(-1);
161 } catch(InterruptedException e) {
162 logger.log(Level.SEVERE, e.getMessage(), e);
163 }
164
165
166 System.out.println( "Worker/" + workerID + " stopping");
167 }
168
169 }

  ViewVC Help
Powered by ViewVC 1.1.20