在Java中并行化HttpsURLConnection

时间:2014-12-06 12:03:57

标签: java multithreading tcp httpsurlconnection

我正在开发一个在特定URL上执行大量HTTP-Post请求的应用程序。数据通过JSON文件包含在请求中。执行单个POST请求大约需要200毫秒,直到我收到响应代码。为了并行化这些请求,我开始使用不同的工作线程,打开每个HTTPURLConnection并通过此连接发布它们的请求。 不幸的是,我没有看到太多改进,所以我想澄清TCP套接字的基本情况,并从你们那里得到一些想法。

我的每个工作人员都执行请求,如下例所示。

    public void submitRequest() {
    URL url = new URL("https://example.com");
    HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
    conn.setRequestProperty("Content-Type", "application/json");
    conn.setRequestProperty("Accept", "application/json");
    conn.setDoOutput(true);
    conn.setRequestMethod("POST");

    DataOutputStream output = new DataOutputStream(conn.getOutputStream());

    // Construct the POST data.
    String content = generatedJSONString();

    // Send the request data
    output.writeBytes(content);
    output.flush();
    output.close();

    // Check response code here
    int response = conn.getResponseCode();

}

因为每个工作者都使用自己的HttpsURLConnection,我假设每个工作者只进行一次必要的TLS握手,然后可以执行请求而无需额外的握手?我希望每个工作者都使用自己的TCP连接到服务器。我试着和Wireshark一起检查,但它没有告诉我TLS握手,我真的不知道为什么。

即使并行使用50名工作人员,我的代码执行速度也不够快,无法将相关数据发布到网址。因此我问自己这个问题是否因为TCP连接没有被代码饱和,因为与TCP / HTTP开销相比,JSON数据(通常是10个键值对)对于少量数据。如果不是,我可能会要求服务提供商考虑以批处理方式提供数据的更好方法,以便为每个POST请求提交更多JSON数据。我也改为使用Apache HTTPClient的代码,但我得到了类似的性能,因此我认为我认为TLS连接建立和重用的方式存在错误。

0 个答案:

没有答案