Search in sources :

Example 1 with HttpExecuteInterceptor

use of com.google.api.client.http.HttpExecuteInterceptor in project google-api-java-client by google.

the class BatchRequest method execute.

/**
 * Executes all queued HTTP requests in a single call, parses the responses and invokes callbacks.
 *
 * <p>
 * Calling {@link #execute()} executes and clears the queued requests. This means that the
 * {@link BatchRequest} object can be reused to {@link #queue} and {@link #execute()} requests
 * again.
 * </p>
 */
public void execute() throws IOException {
    boolean retryAllowed;
    Preconditions.checkState(!requestInfos.isEmpty());
    HttpRequest batchRequest = requestFactory.buildPostRequest(this.batchUrl, null);
    // NOTE: batch does not support gzip encoding
    HttpExecuteInterceptor originalInterceptor = batchRequest.getInterceptor();
    batchRequest.setInterceptor(new BatchInterceptor(originalInterceptor));
    int retriesRemaining = batchRequest.getNumberOfRetries();
    BackOffPolicy backOffPolicy = batchRequest.getBackOffPolicy();
    if (backOffPolicy != null) {
        // Reset the BackOffPolicy at the start of each execute.
        backOffPolicy.reset();
    }
    do {
        retryAllowed = retriesRemaining > 0;
        MultipartContent batchContent = new MultipartContent();
        batchContent.getMediaType().setSubType("mixed");
        int contentId = 1;
        for (RequestInfo<?, ?> requestInfo : requestInfos) {
            batchContent.addPart(new MultipartContent.Part(new HttpHeaders().setAcceptEncoding(null).set("Content-ID", contentId++), new HttpRequestContent(requestInfo.request)));
        }
        batchRequest.setContent(batchContent);
        HttpResponse response = batchRequest.execute();
        BatchUnparsedResponse batchResponse;
        try {
            // Find the boundary from the Content-Type header.
            String boundary = "--" + response.getMediaType().getParameter("boundary");
            // Parse the content stream.
            InputStream contentStream = response.getContent();
            batchResponse = new BatchUnparsedResponse(contentStream, boundary, requestInfos, retryAllowed);
            while (batchResponse.hasNext) {
                batchResponse.parseNextResponse();
            }
        } finally {
            response.disconnect();
        }
        List<RequestInfo<?, ?>> unsuccessfulRequestInfos = batchResponse.unsuccessfulRequestInfos;
        if (!unsuccessfulRequestInfos.isEmpty()) {
            requestInfos = unsuccessfulRequestInfos;
            // backOff if required.
            if (batchResponse.backOffRequired && backOffPolicy != null) {
                long backOffTime = backOffPolicy.getNextBackOffMillis();
                if (backOffTime != BackOffPolicy.STOP) {
                    try {
                        sleeper.sleep(backOffTime);
                    } catch (InterruptedException exception) {
                    // ignore
                    }
                }
            }
        } else {
            break;
        }
        retriesRemaining--;
    } while (retryAllowed);
    requestInfos.clear();
}
Also used : HttpRequest(com.google.api.client.http.HttpRequest) HttpHeaders(com.google.api.client.http.HttpHeaders) BackOffPolicy(com.google.api.client.http.BackOffPolicy) InputStream(java.io.InputStream) HttpResponse(com.google.api.client.http.HttpResponse) MultipartContent(com.google.api.client.http.MultipartContent) HttpExecuteInterceptor(com.google.api.client.http.HttpExecuteInterceptor)

Aggregations

BackOffPolicy (com.google.api.client.http.BackOffPolicy)1 HttpExecuteInterceptor (com.google.api.client.http.HttpExecuteInterceptor)1 HttpHeaders (com.google.api.client.http.HttpHeaders)1 HttpRequest (com.google.api.client.http.HttpRequest)1 HttpResponse (com.google.api.client.http.HttpResponse)1 MultipartContent (com.google.api.client.http.MultipartContent)1 InputStream (java.io.InputStream)1