zoukankan      html  css  js  c++  java
  • Using the FutureRequestExecutionService Based on classic (blocking) I/O handle a great number of concurrent connections is more important than performance in terms of a raw data throughput

    Chapter 7. Advanced topics http://hc.apache.org/httpcomponents-client-ga/tutorial/html/advanced.html

    7.3. Using the FutureRequestExecutionService

    Using the FutureRequestExecutionService, you can schedule http calls and treat the response as a Future. This is useful when e.g. making multiple calls to a web service. The advantage of using the FutureRequestExecutionService is that you can use multiple threads to schedule requests concurrently, set timeouts on the tasks, or cancel them when a response is no longer necessary.

    FutureRequestExecutionService wraps the request with a HttpRequestFutureTask, which extends FutureTask. This class allows you to cancel the task as well as keep track of various metrics such as request duration.

    7.3.1. Creating the FutureRequestExecutionService

    The constructor for the futureRequestExecutionService takes any existing httpClient instance and an ExecutorService instance. When configuring both, it is important to align the maximum number of connections with the number of threads you are going to use. When there are more threads than connections, the connections may start timing out because there are no available connections. When there are more connections than threads, the futureRequestExecutionService will not use all of them

    HttpClient httpClient = HttpClientBuilder.create().setMaxConnPerRoute(5).build();
    ExecutorService executorService = Executors.newFixedThreadPool(5);
    FutureRequestExecutionService futureRequestExecutionService =
        new FutureRequestExecutionService(httpClient, executorService);
    

    7.3.2. Scheduling requests

    To schedule a request, simply provide a HttpUriRequest, HttpContext, and a ResponseHandler. Because the request is processed by the executor service, a ResponseHandler is mandatory.

    private final class OkidokiHandler implements ResponseHandler<Boolean> {
        public Boolean handleResponse(
                final HttpResponse response) throws ClientProtocolException, IOException {
            return response.getStatusLine().getStatusCode() == 200;
        }
    }
    
    HttpRequestFutureTask<Boolean> task = futureRequestExecutionService.execute(
        new HttpGet("http://www.google.com"), HttpClientContext.create(),
        new OkidokiHandler());
    // blocks until the request complete and then returns true if you can connect to Google
    boolean ok=task.get();
    

    7.3.3. Canceling tasks

    Scheduled tasks may be cancelled. If the task is not yet executing but merely queued for execution, it simply will never execute. If it is executing and the mayInterruptIfRunning parameter is set to true, abort() will be called on the request; otherwise the response will simply be ignored but the request will be allowed to complete normally. Any subsequent calls to task.get() will fail with an IllegalStateException. It should be noticed that canceling tasks merely frees up the client side resources. The request may actually be handled normally on the server side.

    task.cancel(true)
    task.get() // throws an Exception
    

    7.3.4. Callbacks

    Instead of manually calling task.get(), you can also use a FutureCallback instance that gets callbacks when the request completes. This is the same interface as is used in HttpAsyncClient

    private final class MyCallback implements FutureCallback<Boolean> {
    
        public void failed(final Exception ex) {
            // do something
        }
    
        public void completed(final Boolean result) {
            // do something
        }
    
        public void cancelled() {
            // do something
        }
    }
    
    HttpRequestFutureTask<Boolean> task = futureRequestExecutionService.execute(
        new HttpGet("http://www.google.com"), HttpClientContext.create(),
        new OkidokiHandler(), new MyCallback());
    

    7.3.5. Metrics

    FutureRequestExecutionService is typically used in applications that make large amounts of web service calls. To facilitate e.g. monitoring or configuration tuning, the FutureRequestExecutionService keeps track of several metrics.

    Each HttpRequestFutureTask provides methods to get the time the task was scheduled, started, and ended. Additionally, request and task duration are available as well. These metrics are aggregated in the FutureRequestExecutionService in a FutureRequestExecutionMetrics instance that may be accessed through FutureRequestExecutionService.metrics().

    task.scheduledTime() // returns the timestamp the task was scheduled
    task.startedTime() // returns the timestamp when the task was started
    task.endedTime() // returns the timestamp when the task was done executing
    task.requestDuration // returns the duration of the http request
    task.taskDuration // returns the duration of the task from the moment it was scheduled
    
    FutureRequestExecutionMetrics metrics = futureRequestExecutionService.metrics()
    metrics.getActiveConnectionCount() // currently active connections
    metrics.getScheduledConnectionCount(); // currently scheduled connections
    metrics.getSuccessfulConnectionCount(); // total number of successful requests
    metrics.getSuccessfulConnectionAverageDuration(); // average request duration
    metrics.getFailedConnectionCount(); // total number of failed tasks
    metrics.getFailedConnectionAverageDuration(); // average duration of failed tasks
    metrics.getTaskCount(); // total number of tasks scheduled
    metrics.getRequestCount(); // total number of requests
    metrics.getRequestAverageDuration(); // average request duration
    metrics.getTaskAverageDuration(); // average task duration


    Preface http://hc.apache.org/httpcomponents-client-ga/tutorial/html/preface.html

    The Hyper-Text Transfer Protocol (HTTP) is perhaps the most significant protocol used on the Internet today. Web services, network-enabled appliances and the growth of network computing continue to expand the role of the HTTP protocol beyond user-driven web browsers, while increasing the number of applications that require HTTP support.

    Although the java.net package provides basic functionality for accessing resources via HTTP, it doesn't provide the full flexibility or functionality needed by many applications. HttpClient seeks to fill this void by providing an efficient, up-to-date, and feature-rich package implementing the client side of the most recent HTTP standards and recommendations.

    Designed for extension while providing robust support for the base HTTP protocol, HttpClient may be of interest to anyone building HTTP-aware client applications such as web browsers, web service clients, or systems that leverage or extend the HTTP protocol for distributed communication.

    1. HttpClient scope

    • Client-side HTTP transport library based on HttpCore

    • Based on classic (blocking) I/O

    • Content agnostic

    2. What HttpClient is NOT

    • HttpClient is NOT a browser. It is a client side HTTP transport library. HttpClient's purpose is to transmit and receive HTTP messages. HttpClient will not attempt to process content, execute javascript embedded in HTML pages, try to guess content type, if not explicitly set, or reformat request / rewrite location URIs, or other functionality unrelated to the HTTP transport.

    Apache HttpComponents – HttpComponents HttpAsyncClient Examples http://hc.apache.org/httpcomponents-asyncclient-dev/examples.html

     http://hc.apache.org/httpcomponents-asyncclient-dev/httpasyncclient/examples/org/apache/http/examples/nio/client/AsyncClientHttpExchange.java http://hc.apache.org/httpcomponents-asyncclient-dev/httpasyncclient/examples/org/apache/http/examples/nio/client/AsyncClientHttpExchange.java

    package org.apache.http.examples.nio.client;
    
    import java.util.concurrent.Future;
    
    import org.apache.http.HttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
    import org.apache.http.impl.nio.client.HttpAsyncClients;
    
    /**
     * This example demonstrates a basic asynchronous HTTP request / response exchange.
     * Response content is buffered in memory for simplicity.
     */
    public class AsyncClientHttpExchange {
    
        public static void main(final String[] args) throws Exception {
            CloseableHttpAsyncClient httpclient = HttpAsyncClients.createDefault();
            try {
                httpclient.start();
                HttpGet request = new HttpGet("http://httpbin.org/get");
                Future<HttpResponse> future = httpclient.execute(request, null);
                HttpResponse response = future.get();
                System.out.println("Response: " + response.getStatusLine());
                System.out.println("Shutting down");
            } finally {
                httpclient.close();
            }
            System.out.println("Done");
        }
    
    }

    Apache HttpComponents – Apache HttpComponents http://hc.apache.org/

    HttpComponents AsyncClient

    Asynch HttpClient is a HTTP/1.1 compliant HTTP agent implementation based on HttpCore NIO and HttpClient components. It is a complementary module to Apache HttpClient intended for special cases where ability to handle a great number of concurrent connections is more important than performance in terms of a raw data throughput.

    【nio与性能的关系】


  • 相关阅读:
    取消 Vue 中格式编译警告
    Vue 中提示报错 handlers[i].call is not a function解决方法
    PhpStorm 配置链接远程虚拟机
    Java 类提供了自定义的构造方法,那么类的默认构造不会被调用
    2019.9.30极限测试 04.JAVA语言课堂测试试卷-极限测试
    程序员修炼之道+从小工到专家 9月份读后感
    2019.9.23 作业2
    2019.9.23 作业1
    原码,补码,反码区分
    9.16日上课总结
  • 原文地址:https://www.cnblogs.com/rsapaper/p/9963987.html
Copyright © 2011-2022 走看看