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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2903 - (hide annotations) (download)
Wed Feb 3 18:45:33 2016 UTC (8 years, 3 months ago) by torben
File size: 6988 byte(s)
Implement logging system

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

  ViewVC Help
Powered by ViewVC 1.1.20