Changeset 5458 for OAIHarvester/trunk/OAIHarvester/src/main/java/eu/clarin/cmdi/oai/harvester/impl/HarvestWorker.java
- Timestamp:
- 07/08/14 11:50:40 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
OAIHarvester/trunk/OAIHarvester/src/main/java/eu/clarin/cmdi/oai/harvester/impl/HarvestWorker.java
r3931 r5458 13 13 import org.apache.http.HttpResponse; 14 14 import org.apache.http.HttpStatus; 15 import org.apache.http.client.HttpClient; 15 import org.apache.http.client.config.CookieSpecs; 16 import org.apache.http.client.config.RequestConfig; 17 import org.apache.http.client.methods.CloseableHttpResponse; 16 18 import org.apache.http.client.methods.HttpGet; 17 import org.apache.http.client.utils.HttpClientUtils; 18 import org.apache.http.impl.client.DefaultHttpClient; 19 import org.apache.http.impl.cookie.DateParseException; 20 import org.apache.http.impl.cookie.DateUtils; 21 import org.apache.http.params.CoreConnectionPNames; 22 import org.apache.http.params.CoreProtocolPNames; 23 import org.apache.http.params.HttpParams; 24 import org.apache.http.util.EntityUtils; 19 import org.apache.http.client.utils.DateUtils; 20 import org.apache.http.config.SocketConfig; 21 import org.apache.http.impl.NoConnectionReuseStrategy; 22 import org.apache.http.impl.client.CloseableHttpClient; 23 import org.apache.http.impl.client.HttpClients; 24 import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; 25 import org.apache.http.protocol.BasicHttpContext; 25 26 import org.joda.time.DateTime; 26 27 import org.joda.time.DateTimeZone; … … 45 46 46 47 public class HarvestWorker { 48 private static final String USER_AGENT = "OAI-Harvester/1.0.0"; 47 49 private static final String OAI_NS = "http://www.openarchives.org/OAI/2.0/"; 48 50 private static final String ARG_METADATA_PREFIX = "metadataPrefix"; … … 68 70 LoggerFactory.getLogger(HarvestWorker.class); 69 71 private final AbstractHarvester harvester; 70 private final HttpClient client;72 private final CloseableHttpClient client; 71 73 private final RequestUriBuilder uriBuilder; 72 74 private final HeaderImpl header; … … 77 79 HarvestWorker(AbstractHarvester harvester) { 78 80 this.harvester = harvester; 79 // http client 80 client = new DefaultHttpClient(); 81 client.getParams().setParameter(CoreProtocolPNames.USER_AGENT, 82 "eu.clarin.cmdi.oai.Harvester/0.0.1"); 81 82 // create HTTP client 83 // FIXME: get timeout values from somewhere? 84 final int connectTimeout = 30 * 1000; 85 final int socketTimeout = 180 * 1000; 86 client = createHttpClient(connectTimeout, socketTimeout); 87 83 88 // request stuff 84 89 uriBuilder = new RequestUriBuilder(); … … 490 495 } 491 496 request.addHeader(HEADER_CONNECTION, "close"); 492 // FIXME: get timeout values from somewhere? 493 HttpParams params = request.getParams(); 494 params.setParameter(CoreConnectionPNames.SO_TIMEOUT, 180000); 495 params.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 30000); 496 497 final HttpResponse response = client.execute(request); 497 498 498 /* 499 499 * FIXME: the following code need serious re-factoring 500 500 */ 501 boolean close = false; 501 CloseableHttpResponse response = null; 502 boolean close = true; 502 503 try { 504 response = client.execute(request, new BasicHttpContext()); 503 505 job.addToNetworkTime(System.currentTimeMillis() - now); 506 504 507 final int status = response.getStatusLine().getStatusCode(); 505 508 if (status == HttpStatus.SC_OK) { 506 509 delay = 0; 510 close = false; 507 511 return new Response(job, response, harvester); 508 512 } else { … … 511 515 logger.debug("got service unavailable status, retrying " + 512 516 "after {} seconds", delay); 513 close = true;514 517 return null; 515 518 } else { … … 520 523 } 521 524 } catch (IOException e) { 522 close = true;523 525 throw e; 524 526 } catch (XMLStreamException e) { 525 close = true;526 527 throw e; 527 528 } catch (HarvesterException e) { 528 close = true;529 529 throw e; 530 530 } finally { 531 if (close) { 532 /* 533 * try hard to release HTTP client resources ... 534 */ 535 try { 536 EntityUtils.consume(response.getEntity()); 537 } catch (IOException ex) { 538 /* IGNORE */ 539 } 540 541 /* make sure to release allocated resources */ 542 HttpClientUtils.closeQuietly(response); 543 544 if (request != null) { 545 request.abort(); 546 } 531 if (close && (response != null)) { 532 /* make sure. response is closed ... */ 533 response.close(); 547 534 } 548 535 } … … 561 548 delay = Integer.parseInt(v) * 1000; 562 549 } catch (NumberFormatException e) { 563 try {564 550 Date date = DateUtils.parseDate(v); 565 delay = date.getTime() - System.currentTimeMillis(); 566 } catch (DateParseException f) { 567 /* IGNORE */ 568 } 551 if (date != null) { 552 delay = date.getTime() - System.currentTimeMillis(); 553 } 569 554 } 570 555 } … … 615 600 } 616 601 602 603 private static CloseableHttpClient createHttpClient(int connectTimeout, 604 int socketTimeout) { 605 final PoolingHttpClientConnectionManager manager = 606 new PoolingHttpClientConnectionManager(); 607 manager.setDefaultMaxPerRoute(8); 608 manager.setMaxTotal(128); 609 610 final SocketConfig socketConfig = SocketConfig.custom() 611 .setSoReuseAddress(true) 612 .setSoLinger(0) 613 .build(); 614 615 final RequestConfig requestConfig = RequestConfig.custom() 616 .setAuthenticationEnabled(false) 617 .setRedirectsEnabled(true) 618 .setMaxRedirects(4) 619 .setCircularRedirectsAllowed(false) 620 .setCookieSpec(CookieSpecs.IGNORE_COOKIES) 621 .setConnectTimeout(connectTimeout) 622 .setSocketTimeout(socketTimeout) 623 .setConnectionRequestTimeout(0) /* infinite */ 624 .setStaleConnectionCheckEnabled(false) 625 .build(); 626 627 return HttpClients.custom() 628 .setUserAgent(USER_AGENT) 629 .setConnectionManager(manager) 630 .setDefaultSocketConfig(socketConfig) 631 .setDefaultRequestConfig(requestConfig) 632 .setConnectionReuseStrategy(new NoConnectionReuseStrategy()) 633 .build(); 634 } 635 617 636 } // class HarvestWorker
Note: See TracChangeset
for help on using the changeset viewer.