/[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 2903 - (show annotations) (download)
Wed Feb 3 18:45:33 2016 UTC (8 years, 3 months ago) by torben
File size: 5025 byte(s)
Implement logging system

Switch task to rest/jersey
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.CyclicBarrier;
8 import java.util.concurrent.atomic.AtomicInteger;
9 import java.util.logging.Level;
10
11 import ags.utils.dataStructures.MaxHeap;
12 import ags.utils.dataStructures.trees.thirdGenKD.DistanceFunction;
13 import ags.utils.dataStructures.trees.thirdGenKD.KdTree;
14 import ags.utils.dataStructures.trees.thirdGenKD.SquareEuclideanDistanceFunction;
15 import dk.daoas.adressevedligehold.ServiceConfig;
16 import dk.daoas.adressevedligehold.beans.Address;
17 import dk.daoas.adressevedligehold.tasks.Task;
18 import dk.daoas.adressevedligehold.tasks.TaskLogger;
19
20 public class LookupWorker implements Runnable {
21
22 static final int MAX_RESULTS = 99;
23
24
25 private TaskLogger logger = TaskLogger.getInstance();
26
27 OSRMHelper osrmHelper = new OSRMHelper();
28
29 CyclicBarrier barrier;
30 Queue<Address> ikkeDaekkede;
31 Map<Short, KdTree<Address>> hoTrees;
32 Database db;
33 Constants consts;
34
35 AtomicInteger antalFundne;
36 AtomicInteger antalBeregnet;
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 AtomicInteger antalBeregnet,
52 Database db,
53 boolean verbose,
54 Constants consts) {
55
56 this.workerID = workerID;
57 this.task = task;
58 this.barrier = barrier;
59 this.ikkeDaekkede = ikkeDaekkede;
60 this.hoTrees = hoTrees;
61 this.antalFundne = antalFundne;
62 this.antalBeregnet = antalBeregnet;
63 this.db = db;
64 this.verbose = verbose;
65 this.consts = consts;
66
67 }
68
69
70 @Override
71 public void run() {
72 System.out.println( "Worker/" + workerID + " starting");
73
74 ServiceConfig conf = ServiceConfig.getInstance();
75
76 try (BarrierMarker marker = new BarrierMarker() ) {
77 while ( ! ikkeDaekkede.isEmpty() ) {
78
79 if (task.isAborted()) {
80 System.out.println( "Worker/" + workerID + " aborting");
81 break;
82 }
83
84
85 Address qAddress = ikkeDaekkede.remove();
86
87 short ho = qAddress.ho;
88 KdTree<Address> addressTree = hoTrees.get(ho);
89
90 MaxHeap<Address> res = addressTree.findNearestNeighbors(qAddress.xyz, MAX_RESULTS, dist);
91 //Collection<Address> res = addressTree.nearestNeighbourSearch(MAX_RESULTS, qAddress);
92 int size = res.size();
93 if (size > MAX_RESULTS ) {
94 System.out.println("Returnerede mere end MAX_RESULTS> " + res.size() );
95 throw new Exception("Returnerede mere end MAX_RESULTS> " + res.size());
96 }
97
98 ArrayList<Address> adrList = new ArrayList<Address>();
99
100 for (int i=0; i<size; i++) {
101 Address a = res.getMax();
102 adrList.add(a);
103 res.removeMax();
104 }
105 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
106 double bedsteAfstand = GeoPointHelper.beregnAfstand(qAddress, bedsteAdr);
107
108
109 if ( conf.useOsrm == true) {
110 //Hvis at den er inden for afstand, så prøver vi at lave findNærmste på vej distancen
111 if (bedsteAfstand <= consts.getMaxDistance()) {
112
113 Address bedsteAdr2 = osrmHelper.getNearestTableHttp(qAddress, adrList);
114
115 if (bedsteAdr2 != null) {
116 bedsteAdr = bedsteAdr2;
117 bedsteAfstand = GeoPointHelper.beregnAfstand(qAddress, bedsteAdr);
118 } else {
119 logger.info("OSRM returned null for " + qAddress);
120 }
121 }
122 }
123
124
125
126
127
128 if (bedsteAfstand <= consts.getMaxDistance() ) { //Gem kun hvis distancen er under max_distance for distributøren
129 if (verbose == true) {
130 logger.fine("(" +workerID + ") Bedste: " + qAddress + "==>" + bedsteAdr + " ::: " + bedsteAfstand );
131 }
132
133 antalFundne.incrementAndGet();
134
135 try {
136 db.gemResultat(qAddress, bedsteAdr, bedsteAfstand);
137 } catch (SQLException e) {
138 logger.warning("Error saving result", e);
139 logger.warning("Shutting down");
140 throw e; // rethrow
141 }
142 } else {
143 if (verbose == true) {
144 System.out.println("For stor afstand: " + qAddress + " > " + bedsteAfstand);
145 }
146 }
147
148 antalBeregnet.incrementAndGet();
149 }
150
151 } catch (Exception e) {
152 logger.log( Level.SEVERE, "Worker/" + workerID, e);
153 task.doAbort();
154 }
155
156
157
158
159 System.out.println( "Worker/" + workerID + " stopping");
160 }
161
162
163 /**
164 * Makes sure the barrier is touched correctly no matter how the the current code block is exited.
165 * @author thn
166 *
167 */
168 public class BarrierMarker implements AutoCloseable {
169 @Override
170 public void close() {
171 try {
172 logger.info( "Worker/" + workerID + " afventer barrier");
173 barrier.await();
174 } catch (Exception e) {
175 logger.log(Level.SEVERE, e.getMessage(), e);
176 }
177 }
178 }
179
180 }

  ViewVC Help
Powered by ViewVC 1.1.20