Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中并行化HttpsURLConnection_Java_Multithreading_Tcp_Httpsurlconnection - Fatal编程技术网

在Java中并行化HttpsURLConnection

在Java中并行化HttpsURLConnection,java,multithreading,tcp,httpsurlconnection,Java,Multithreading,Tcp,Httpsurlconnection,我正在开发一个在特定URL上执行大量HTTP Post请求的应用程序。数据通过JSON文件包含到请求中。执行一个POST请求大约需要200毫秒,直到我返回响应代码。为了并行化这些请求,我开始使用不同的工作线程,分别打开一个HTTPURLConnection并通过这个连接发布它们的请求。 不幸的是,我没有看到太多的改进,所以我想澄清TCP套接字的基本情况,并从你们那里得到一些想法 我的每个工作人员都像下面的示例一样执行请求 public void submitRequest() {

我正在开发一个在特定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个并行工作人员,我的代码执行速度也不足以将相关数据发布到url。因此,我问自己,这是否是因为TCP连接没有被代码饱和,因为JSON数据通常是10个键值对,与TCP/HTTP开销相比,数据量很少。如果不是,我可能会要求服务提供商考虑一种更好的方法,以批处理方式交付数据,即每个POST请求提交更多JSON数据。我还更改了使用ApacheHttpClient的代码,但我获得了类似的性能,因此我认为TLS连接的建立和重用方式存在错误

您正在执行API请求吗?您是在处理请求后重新使用相同的连接还是一次又一次地创建连接?是的,我正在执行API请求。JavaDoc说每个HttpURLConnection实例都用于发出单个请求,但是到HTTP服务器的底层网络连接可能会被其他实例透明地共享。在请求后对HttpURLConnection的InputStream或OutputStream调用close方法可能会释放与此实例关联的网络资源,但对任何共享的持久连接都没有影响。如果持久连接在当时处于空闲状态,则调用disconnect方法可能会关闭底层套接字。所以连接应该被重用,对吗?我不会做并行请求,充其量它只会使你的网络连接饱和。在最坏的情况下,它会让你从其他网站被禁止。你应该串行运行连接并并行处理数据-一种典型的生产者-消费者模式。数据已经由另一个线程处理,我有一个BlockingQueue,工作线程在其中拾取数据,将其重写为JSON格式并发送到服务器,但是,由于每个POST请求最多需要200毫秒,到服务器的RTT大约为40毫秒,因此我尝试将请求并行化。即使在并行使用更多连接时,我的输出连接上也只有400 KB/s。我假设每个请求可以发布的数据非常少,足以使TCP连接饱和。