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

  ViewVC Help
Powered by ViewVC 1.1.20