4 |
import java.util.ArrayList; |
import java.util.ArrayList; |
5 |
import java.util.Map; |
import java.util.Map; |
6 |
import java.util.Queue; |
import java.util.Queue; |
|
import java.util.concurrent.BrokenBarrierException; |
|
7 |
import java.util.concurrent.CyclicBarrier; |
import java.util.concurrent.CyclicBarrier; |
8 |
import java.util.concurrent.atomic.AtomicInteger; |
import java.util.concurrent.atomic.AtomicInteger; |
9 |
import java.util.logging.Level; |
import java.util.logging.Level; |
|
import java.util.logging.Logger; |
|
10 |
|
|
11 |
import ags.utils.dataStructures.MaxHeap; |
import ags.utils.dataStructures.MaxHeap; |
12 |
import ags.utils.dataStructures.trees.thirdGenKD.DistanceFunction; |
import ags.utils.dataStructures.trees.thirdGenKD.DistanceFunction; |
15 |
import dk.daoas.adressevedligehold.ServiceConfig; |
import dk.daoas.adressevedligehold.ServiceConfig; |
16 |
import dk.daoas.adressevedligehold.beans.Address; |
import dk.daoas.adressevedligehold.beans.Address; |
17 |
import dk.daoas.adressevedligehold.tasks.Task; |
import dk.daoas.adressevedligehold.tasks.Task; |
18 |
|
import dk.daoas.adressevedligehold.tasks.TaskLogger; |
19 |
|
|
20 |
public class LookupWorker implements Runnable { |
public class LookupWorker implements Runnable { |
21 |
|
|
22 |
static final int MAX_RESULTS = 99; |
static final int MAX_RESULTS = 99; |
23 |
|
|
24 |
|
|
25 |
final static Logger logger = Logger.getLogger( LookupWorker.class.toString() ); |
private TaskLogger logger = TaskLogger.getInstance(); |
26 |
|
|
27 |
OSRMHelper osrmHelper = new OSRMHelper(); |
OSRMHelper osrmHelper = new OSRMHelper(); |
28 |
|
|
33 |
Constants consts; |
Constants consts; |
34 |
|
|
35 |
AtomicInteger antalFundne; |
AtomicInteger antalFundne; |
36 |
|
AtomicInteger antalBeregnet; |
37 |
|
|
38 |
int workerID; |
int workerID; |
39 |
boolean verbose; |
boolean verbose; |
48 |
Queue<Address> ikkeDaekkede, |
Queue<Address> ikkeDaekkede, |
49 |
Map<Short, KdTree<Address>> hoTrees, |
Map<Short, KdTree<Address>> hoTrees, |
50 |
AtomicInteger antalFundne, |
AtomicInteger antalFundne, |
51 |
|
AtomicInteger antalBeregnet, |
52 |
Database db, |
Database db, |
53 |
boolean verbose, |
boolean verbose, |
54 |
Constants consts) { |
Constants consts) { |
59 |
this.ikkeDaekkede = ikkeDaekkede; |
this.ikkeDaekkede = ikkeDaekkede; |
60 |
this.hoTrees = hoTrees; |
this.hoTrees = hoTrees; |
61 |
this.antalFundne = antalFundne; |
this.antalFundne = antalFundne; |
62 |
|
this.antalBeregnet = antalBeregnet; |
63 |
this.db = db; |
this.db = db; |
64 |
this.verbose = verbose; |
this.verbose = verbose; |
65 |
this.consts = consts; |
this.consts = consts; |
73 |
|
|
74 |
ServiceConfig conf = ServiceConfig.getInstance(); |
ServiceConfig conf = ServiceConfig.getInstance(); |
75 |
|
|
76 |
try { |
try (BarrierMarker marker = new BarrierMarker() ) { |
77 |
while ( ! ikkeDaekkede.isEmpty() ) { |
while ( ! ikkeDaekkede.isEmpty() ) { |
78 |
|
|
79 |
if (task.isAborted()) { |
if (task.isAborted()) { |
80 |
System.out.println( "Worker/" + workerID + " aborting"); |
System.out.println( "Worker/" + workerID + " aborting"); |
81 |
return; |
break; |
82 |
} |
} |
83 |
|
|
84 |
|
|
92 |
int size = res.size(); |
int size = res.size(); |
93 |
if (size > MAX_RESULTS ) { |
if (size > MAX_RESULTS ) { |
94 |
System.out.println("Returnerede mere end MAX_RESULTS> " + res.size() ); |
System.out.println("Returnerede mere end MAX_RESULTS> " + res.size() ); |
95 |
System.exit(0); |
throw new Exception("Returnerede mere end MAX_RESULTS> " + res.size()); |
96 |
} |
} |
97 |
|
|
98 |
ArrayList<Address> adrList = new ArrayList<Address>(); |
ArrayList<Address> adrList = new ArrayList<Address>(); |
135 |
try { |
try { |
136 |
db.gemResultat(qAddress, bedsteAdr, bedsteAfstand); |
db.gemResultat(qAddress, bedsteAdr, bedsteAfstand); |
137 |
} catch (SQLException e) { |
} catch (SQLException e) { |
138 |
logger.log(Level.WARNING, "Error saving result", e); |
logger.warning("Error saving result", e); |
139 |
logger.warning("Shutting down"); |
logger.warning("Shutting down"); |
140 |
throw e; // rethrow |
throw e; // rethrow |
141 |
} |
} |
144 |
System.out.println("For stor afstand: " + qAddress + " > " + bedsteAfstand); |
System.out.println("For stor afstand: " + qAddress + " > " + bedsteAfstand); |
145 |
} |
} |
146 |
} |
} |
147 |
|
|
148 |
|
antalBeregnet.incrementAndGet(); |
149 |
} |
} |
150 |
|
|
151 |
} catch (Exception e) { |
} catch (Exception e) { |
154 |
} |
} |
155 |
|
|
156 |
|
|
157 |
|
|
|
try { |
|
|
logger.info( "Worker/" + workerID + " afventer barrier"); |
|
|
barrier.await(); |
|
|
} catch (BrokenBarrierException e) { |
|
|
logger.log(Level.SEVERE, e.getMessage(), e); |
|
|
System.exit(-1); |
|
|
} catch(InterruptedException e) { |
|
|
logger.log(Level.SEVERE, e.getMessage(), e); |
|
|
} |
|
|
|
|
158 |
|
|
159 |
System.out.println( "Worker/" + workerID + " stopping"); |
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 |
} |
} |