Java 中的 HTTP 触发并忘记

Gok*_*rni 5 java analytics httpresponse httpclient httprequest

我们正在实施我们自己的分析,因为我们公开了一个需要调用的 Web 服务,该服务将捕获我们数据库中的数据。

问题是,由于这是分析,我们将进行大量调用(例如每个页面加载、每个 js 之后调用、CSS 加载等),因此会有很多这样的调用。所以我不希望服务器加载大量请求,以便更精确地等待响应。因为我们得到的回应对我们几乎没有任何用处。

那么有什么方法可以只触发 Web 服务请求而忘记我已经触发了它?

我知道每个 HTTP 请求也会有响应。

因此,让我想到的一件事是,如果我们将请求超时设置为零秒会怎样?但我不确定这是否是正确的做法。

请为我提供更多建议

San*_*aha 5

您可能会发现以下AsyncRequestDemo.java有用:

import java.net.URI;
import java.net.URISyntaxException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import org.apache.http.client.fluent.Async;
import org.apache.http.client.fluent.Content;
import org.apache.http.client.fluent.Request;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.concurrent.FutureCallback;

/**
 * Following libraries have been used:
 * 
 * 1) httpcore-4.4.5.jar
 * 2) httpclient-4.5.2.jar
 * 3) commons-logging-1.2.jar
 * 4) fluent-hc-4.5.2.jar     * 
 *
 */

public class AsyncRequestDemo {
    public static void main(String[] args) throws Exception {
    URIBuilder urlBuilder = new URIBuilder()
                               .setScheme("http")
                               .setHost("stackoverflow.com")
                               .setPath("/questions/38277471/fire-and-forget-for-http-in-java");

    final int nThreads = 3; // no. of threads in the pool
    final int timeout = 0; // connection time out in milliseconds

    URI uri = null;
    try {
        uri = urlBuilder.build();
    } catch (URISyntaxException use) {
        use.printStackTrace();
    }

    ExecutorService executorService = Executors.newFixedThreadPool(nThreads);
    Async async = Async.newInstance().use(executorService);
    final Request request = Request.Get(uri).connectTimeout(timeout);

        Future<Content> future = async.execute(request, new FutureCallback<Content>() {
            public void failed(final Exception e) {
                System.out.println("Request failed: " + request);
                System.exit(1);
            }

            public void completed(final Content content) {
                System.out.println("Request completed: " + request);
                System.out.println(content.asString());
                System.exit(0);
            }

            public void cancelled() {
            }
        });

        System.out.println("Request submitted");

    }

}
Run Code Online (Sandbox Code Playgroud)