/[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 2892 - (hide annotations) (download)
Sun Jan 31 22:50:31 2016 UTC (8 years, 4 months ago) by torben
File size: 7236 byte(s)
Disable logging setup code
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     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 torben 2891 int antalIkkeDaekkede = -1;
39    
40     AtomicInteger antalBeregnet = new AtomicInteger();
41 torben 2878
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 torben 2892 //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 torben 2878
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 torben 2891
87 torben 2878 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 torben 2891 LookupWorker worker = new LookupWorker(i, this, barrier, ikkeDaekkede, hoTrees,antalFundne,antalBeregnet,db,verbose,consts);
151 torben 2878 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 torben 2891 return "Afstand anden rute/" + distributor;
243 torben 2878 }
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 torben 2891 public double getPercentCompleted() {
257     return (antalBeregnet.get() / ((float)antalIkkeDaekkede)) * 100.0;
258 torben 2878 }
259     }

  ViewVC Help
Powered by ViewVC 1.1.20