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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2892 - (show annotations) (download)
Sun Jan 31 22:50:31 2016 UTC (8 years, 3 months ago) by torben
File size: 7236 byte(s)
Disable logging setup code
1 package dk.daoas.adressevedligehold.afstandandenrute;
2
3 import java.sql.Connection;
4 import java.util.HashMap;
5 import java.util.List;
6 import java.util.Map;
7 import java.util.Queue;
8 import java.util.Set;
9 import java.util.concurrent.CyclicBarrier;
10 import java.util.concurrent.Executors;
11 import java.util.concurrent.ThreadFactory;
12 import java.util.concurrent.ThreadPoolExecutor;
13 import java.util.concurrent.atomic.AtomicInteger;
14 import java.util.logging.FileHandler;
15 import java.util.logging.Logger;
16 import java.util.logging.SimpleFormatter;
17
18 import ags.utils.dataStructures.trees.thirdGenKD.KdTree;
19 import dk.daoas.adressevedligehold.ServiceConfig;
20 import dk.daoas.adressevedligehold.beans.Address;
21 import dk.daoas.adressevedligehold.db.DBConnection;
22 import dk.daoas.adressevedligehold.tasks.Task;
23 import dk.daoas.adressevedligehold.util.HttpUtil;
24
25
26
27 public class AfstandAndenRuteTask extends Task {
28
29 final Logger logger = Logger.getLogger( AfstandAndenRuteTask.class.toString() );
30
31 final boolean verbose = false;//
32
33
34 static boolean test_mode;
35
36
37 String distributor;
38 int antalIkkeDaekkede = -1;
39
40 AtomicInteger antalBeregnet = new AtomicInteger();
41
42
43
44 ThreadPoolExecutor threadPool;
45
46
47
48 public AfstandAndenRuteTask(String distributor) {
49 this.distributor = distributor;
50 }
51
52
53 @Override
54 protected void taskRun() throws Exception {
55
56
57
58
59 //Setup j.u.l Logger
60 //Logger root = Logger.getLogger("");
61 //FileHandler fhandler = new FileHandler("fulddaekning.log"); // Ingen max størrelse, ingen rotation og ingen append
62 //fhandler.setFormatter( new SimpleFormatter() );
63 //root.addHandler( fhandler );
64
65
66
67 Constants.init(distributor);
68 Constants consts = Constants.getInstance();
69
70 int max_workers = ServiceConfig.getInstance().maxWorkers;
71 if (max_workers <= 0) {
72 logger.info("!!! AUTO-DETECT MAX_WORKERS !!!");
73 int cores = Runtime.getRuntime().availableProcessors();
74 cores -= 1;//Efterlad 1 core/cpu i reserve til systemet
75
76 max_workers = Math.max(1, cores); //Dog skal der som minimum være 1 core til beregning
77
78 }
79 if (test_mode) {
80 max_workers = 1;
81 }
82 logger.info("Starting with MAX_WORKERS:" + max_workers);
83 setupThreadPool(max_workers);
84
85
86
87 try (Connection conn = DBConnection.getConnection() ) {
88 Database db = new Database(conn);
89
90 Queue<Address> ikkeDaekkede = db.hentAlleIkkedaekkedeAdresser(consts.getMinPostnr(), consts.getMaxPostnr() );
91 antalIkkeDaekkede = ikkeDaekkede.size();
92 logger.info("Antal ikke-daekkede: " + antalIkkeDaekkede );
93
94
95 boolean testRun= false;
96
97 AtomicInteger antalFundne = new AtomicInteger(0);
98
99 long beregnStart =0;
100 long start = System.currentTimeMillis();
101 int antalDaekkedeAdresser = -1;
102
103 if (testRun == false) {
104
105 logger.info("Finder postnumre");
106 Set<Short> postnumre = db.hentPostnumreCache();
107
108 // Først validerer vi BBox på alle postnummre, for at undgå fuldt stop midt i beregningen
109 for(short postnr : postnumre) { //
110 logger.info("Validerer BBox for " + postnr);
111 BoundingBox bbox = db.getBoundingbox(postnr);
112 bbox.validateBbox();
113 }
114
115
116 logger.info("Henter alle daekkede adresser");
117 antalDaekkedeAdresser = db.hentAlleDaekkedeAdresser(distributor);
118 logger.info( "AlleDaekkedeAdresser.length=" + antalDaekkedeAdresser );
119
120 Map<Short, List<Address>> addrHoList = db.getDaekkedeAdresserHO();
121
122 Map<Short, KdTree<Address>> hoTrees = new HashMap<Short,KdTree<Address>>();
123
124 for ( Map.Entry<Short, List<Address>> entry : addrHoList.entrySet() ) {
125 short ho = entry.getKey();
126 List<Address> geopoints = entry.getValue();
127
128 logger.info("Opbygger KDTree for " + ho + " - antal=" + geopoints.size() );
129
130 int bucketSize = 96*12;
131
132 KdTree<Address> addressTree = new KdTree<Address>( 3, bucketSize );
133 for(Address a: geopoints) {
134 addressTree.addPoint(a.xyz, a);
135 }
136
137 hoTrees.put(ho, addressTree);
138 }
139
140 db.resetResultTable();
141
142 beregnStart = System.currentTimeMillis();
143 logger.info("Starter beregning");
144
145 //pre-check er ok - reset tmp tabel og start søgningen
146
147 CyclicBarrier barrier = new CyclicBarrier(max_workers + 1);
148
149 for (int i=0; i<max_workers; i++) {
150 LookupWorker worker = new LookupWorker(i, this, barrier, ikkeDaekkede, hoTrees,antalFundne,antalBeregnet,db,verbose,consts);
151 threadPool.submit( worker );
152 }
153
154 barrier.await(); // Afvent at workerne bliver færdige
155
156 logger.info("Calc is done - cleaning up remaining bits");
157
158 threadPool.shutdown(); //Calc is done now
159
160
161 db.saveBatch();
162
163 if (test_mode == false && this.isAborted() == false) {
164 db.renameResultTables();
165
166 String trigger_url = ServiceConfig.getInstance().trigger_url;
167
168 logger.info("Calling trigger URL");
169 String url = trigger_url + "&trigger=AfstandAndenRute/" + distributor;
170
171 HttpUtil.getContentString(url, 500);
172
173 } else {
174 logger.info( "Rename tables is disabled !!!" );
175 }
176
177
178
179 } else {
180 /// Test
181 /*
182 db.resetResultTable();
183
184
185 alleDaekkedeAdresser = db.hentAlleDaekkedeAdresser();
186 logger.info( "AlleDaekkedeAdresser.length=" + alleDaekkedeAdresser.size());
187
188 short post = (short) 2700;
189 Lookup lookup = new Lookup(post, db, threadPool);
190 lookup.doLookup();*/
191 }
192
193
194 long now = System.currentTimeMillis();
195 long elapsed = now - start ;
196 long elapsedBeregn = now - beregnStart;
197
198
199 logger.info("Fuld load done : " + formatMilliSeconds(elapsed) );
200 logger.info("Fuld load done (beregning) : " + formatMilliSeconds(elapsedBeregn) );
201 logger.info("Antal daekkede : " + antalDaekkedeAdresser );
202 logger.info("Antal ikke-daekkede : " + antalIkkeDaekkede );
203 logger.info("Heraf, antal fundne : " + antalFundne );
204
205 logger.info( String.format("Fandt adresser til : %.2f %%", (antalFundne.get() *100.0)/antalIkkeDaekkede ) );
206 //logger.info("Fandt adresser til : " + (antalFundne*100.0)/ikkeDaekkede.length + "%" );
207
208 }
209 }
210
211
212
213 static String formatMilliSeconds(long milliseconds) {
214 int mseconds = (int) milliseconds % 1000;
215 int seconds = (int) (milliseconds / 1000) % 60 ;
216 int minutes = (int) ((milliseconds / (1000*60)) % 60);
217 int hours = (int) ((milliseconds / (1000*60*60)) % 24);
218
219 return String.format("%02d:%02d:%02d.%03d", hours, minutes, seconds, mseconds);
220 }
221
222 private void setupThreadPool(int max_workers) {
223 threadPool = (ThreadPoolExecutor) Executors.newFixedThreadPool(max_workers, new WorkerThreadFactory() );
224 }
225
226 static class WorkerThreadFactory implements ThreadFactory {
227 int count = 0;
228
229 @Override
230 public Thread newThread(Runnable r) {
231 return new Thread(r, "lookupWorker/" + count++);
232 }
233 }
234
235
236
237
238
239
240 @Override
241 public String getDescription() {
242 return "Afstand anden rute/" + distributor;
243 }
244
245
246
247 @Override
248 public String getDetail() {
249 // TODO Auto-generated method stub
250 return null;
251 }
252
253
254
255 @Override
256 public double getPercentCompleted() {
257 return (antalBeregnet.get() / ((float)antalIkkeDaekkede)) * 100.0;
258 }
259 }

  ViewVC Help
Powered by ViewVC 1.1.20