Ignore:
Timestamp:
07/08/14 11:50:40 (10 years ago)
Author:
Oliver Schonefeld
Message:
  • clean up pom.xml
  • update some dependencies
  • update to Apache Http Client 4.3.x
File:
1 edited

Legend:

Unmodified
Added
Removed
  • OAIHarvester/trunk/OAIHarvester/src/main/java/eu/clarin/cmdi/oai/harvester/impl/HarvestWorker.java

    r3931 r5458  
    1313import org.apache.http.HttpResponse;
    1414import org.apache.http.HttpStatus;
    15 import org.apache.http.client.HttpClient;
     15import org.apache.http.client.config.CookieSpecs;
     16import org.apache.http.client.config.RequestConfig;
     17import org.apache.http.client.methods.CloseableHttpResponse;
    1618import 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;
     19import org.apache.http.client.utils.DateUtils;
     20import org.apache.http.config.SocketConfig;
     21import org.apache.http.impl.NoConnectionReuseStrategy;
     22import org.apache.http.impl.client.CloseableHttpClient;
     23import org.apache.http.impl.client.HttpClients;
     24import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
     25import org.apache.http.protocol.BasicHttpContext;
    2526import org.joda.time.DateTime;
    2627import org.joda.time.DateTimeZone;
     
    4546
    4647public class HarvestWorker {
     48    private static final String USER_AGENT = "OAI-Harvester/1.0.0";
    4749    private static final String OAI_NS = "http://www.openarchives.org/OAI/2.0/";
    4850    private static final String ARG_METADATA_PREFIX = "metadataPrefix";
     
    6870            LoggerFactory.getLogger(HarvestWorker.class);
    6971    private final AbstractHarvester harvester;
    70     private final HttpClient client;
     72    private final CloseableHttpClient client;
    7173    private final RequestUriBuilder uriBuilder;
    7274    private final HeaderImpl header;
     
    7779    HarvestWorker(AbstractHarvester harvester) {
    7880        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
    8388        // request stuff
    8489        uriBuilder = new RequestUriBuilder();
     
    490495        }
    491496        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
    498498        /*
    499499         * FIXME: the following code need serious re-factoring
    500500         */
    501         boolean close = false;
     501        CloseableHttpResponse response = null;
     502        boolean close = true;
    502503        try {
     504            response = client.execute(request, new BasicHttpContext());
    503505            job.addToNetworkTime(System.currentTimeMillis() - now);
     506
    504507            final int status = response.getStatusLine().getStatusCode();
    505508            if (status == HttpStatus.SC_OK) {
    506509                delay = 0;
     510                close = false;
    507511                return new Response(job, response, harvester);
    508512            } else {
     
    511515                    logger.debug("got service unavailable status, retrying " +
    512516                            "after {} seconds", delay);
    513                     close = true;
    514517                    return null;
    515518                } else {
     
    520523            }
    521524        } catch (IOException e) {
    522             close = true;
    523525            throw e;
    524526        } catch (XMLStreamException e) {
    525             close = true;
    526527            throw e;
    527528        } catch (HarvesterException e) {
    528             close = true;
    529529            throw e;
    530530        } 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();
    547534            }
    548535        }
     
    561548                delay = Integer.parseInt(v) * 1000;
    562549            } catch (NumberFormatException e) {
    563                 try {
    564550                    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                    }
    569554            }
    570555        }
     
    615600    }
    616601
     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
    617636} // class HarvestWorker
Note: See TracChangeset for help on using the changeset viewer.