Java异步执行多个HTTP请求的例子(需要apache http类库)

来源:互联网 发布:人工智能在智能交通 编辑:程序博客网 时间:2024/06/01 12:30
直接上代码

 

package org.jivesoftware.spark.util;import java.io.IOException;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import org.apache.http.HttpResponse;import org.apache.http.client.config.RequestConfig;import org.apache.http.client.methods.HttpGet;import org.apache.http.concurrent.FutureCallback;import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;import org.apache.http.impl.nio.client.HttpAsyncClients;import org.jivesoftware.DebugPrint;import org.jivesoftware.spark.SparkManager;//异步埋点数据采集工具类public class HotClickAsync {    static ExecutorService service = Executors.newSingleThreadExecutor(); //单一线程    // 调用http请求。不阻塞主线程    public static void SendRequest(final String event)            throws InterruptedException, IOException {                Runnable run = new Runnable() {            @Override            public void run() {                try {                    SendRequestAsync(event,SparkManager.getSessionManager().getUsername());                } catch (InterruptedException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                } catch (IOException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }            }        };        service.execute(run);    }    // 阻塞HTTP调用    private static void SendRequestAsync(String event,String username)            throws InterruptedException, IOException {        RequestConfig requestConfig = RequestConfig.custom()                .setSocketTimeout(1000) // http超时                .setConnectTimeout(1000).build(); // 连接超时        CloseableHttpAsyncClient httpclient = HttpAsyncClients.custom()                .setDefaultRequestConfig(requestConfig).build();        try {            httpclient.start();            final HttpGet[] requests = new HttpGet[] { new HttpGet(                    "http://XXXXXX.cn:81/HotClick.aspx?event="+ event +"&username="+username) // 第一个采集地址            // , new HttpGet("http://mta.qq.com")//第二个采集地址, http://mta.qq.com/            };            // 同步计数            final CountDownLatch latch = new CountDownLatch(requests.length);            for (final HttpGet request : requests) {                httpclient.execute(request, new FutureCallback<HttpResponse>() {                    @Override                    public void completed(final HttpResponse response) {                        latch.countDown();                        DebugPrint.outStirng(request.getRequestLine() + "####->"                                + response.getStatusLine());                                            }                    @Override                    public void failed(final Exception ex) {                        latch.countDown();                        DebugPrint.outStirng(request.getRequestLine() + "####->" + ex);                    }                    @Override                    public void cancelled() {                        latch.countDown();                        //DebugPrint.outStirng(request.getRequestLine()                        //        + " cancelled");                    }                });            }            latch.await();        } finally {            httpclient.close();        }        DebugPrint.outStirng(" ###  HotClickAsync Done ###");    }}

 

0 0
原创粉丝点击