Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.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 向一个URL并发发送多个POST请求_Java_Multithreading_Http_Post_Concurrency - Fatal编程技术网

Java 向一个URL并发发送多个POST请求

Java 向一个URL并发发送多个POST请求,java,multithreading,http,post,concurrency,Java,Multithreading,Http,Post,Concurrency,主要目标是通过REST服务将xml文件从一个文件夹发送到Cassandra DB。我要做的就是读取某个文件夹中的所有文件,然后创建一个Worker对象,并在其中设置文件路径 while (RUNS > 0) { ExecutorService executor = Executors.newFixedThreadPool(N_THREADS); File dir = new File(PATH_TO_SAMPLES);

主要目标是通过REST服务将xml文件从一个文件夹发送到Cassandra DB。我要做的就是读取某个文件夹中的所有文件,然后创建一个Worker对象,并在其中设置文件路径

while (RUNS > 0) {
            ExecutorService executor = Executors.newFixedThreadPool(N_THREADS);

            File dir = new File(PATH_TO_SAMPLES);
            File[] listFiles = dir.listFiles();

            if (listFiles != null) {

                for (File file : listFiles) {

                    Worker worker = new Worker();
                    worker.setPath(file.toPath());

                    executor.submit(worker);
                }
            }

            executor.shutdown();

            // Wait until all threads are finish
            while (!executor.isTerminated()) {
            }

            Thread.sleep(1000);

            RUNS--;
        }
之后,执行器获得一个worker实例并转到目录中的下一个文件。 使用总迭代次数的值初始化运行,默认值为100_000。 N_THREADS-线程总数,默认设置为100

工人类实现可运行的。运行方法:

@Override
    public void run() {

        String url = getUrl();
        String payload = "xml_file_representation";

        MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();

        HttpClient client = new HttpClient();

        HttpConnectionManagerParams httpConnectionManagerParams = new HttpConnectionManagerParams();
        connectionManager.setParams(httpConnectionManagerParams);

        client.setHttpConnectionManager(connectionManager);

        PostMethod postMethod = new PostMethod(url);

        try {

            postMethod.setRequestHeader("User-Agent", USER_AGENT);
            postMethod.setRequestHeader("Content-Type", "application/xml");

            postMethod.setRequestEntity(new StringRequestEntity(payload, "application/xml", StandardCharsets.UTF_8.toString()));

            int statusCode = client.executeMethod(postMethod);

            InputStream body = postMethod.getResponseBodyAsStream();

            if (statusCode == HttpStatus.SC_OK) {

                //OK
            }

        } catch (Exception e) {
            LOG.error("POST: ERROR!");
        } finally {
            postMethod.releaseConnection();
            connectionManager.shutdown();
        }
    }
如果我取消等待,即

睡眠(1000)

在运行结束时,当~16_000请求被发送时,我将得到一个异常:

java.net.BindException: Address already in use
很像

无论如何,接受的答案对我没有帮助。我没有更多的想法,我需要做什么来关闭这些“连接”,以防止那个错误


像Thread.sleep()这样的变通方法看起来也不是一个好的解决方案。感谢您的帮助或建议。

为每个员工创建一个conn mgr违背了conn mgr的目的。从博格链接的另一篇帖子判断,它应该在线程之间共享。 就像一个也没有

您的操作系统在关闭后保持套接字延迟。除了在另一个问题中提出的设计中重用套接字(连接)之外,您可以做的事情不多

除非你想冒险玩Socket.setSOLinger()


Thread.sleep(1000)当然不是一个可行的选择,因为你可能需要一天多的时间。。。或者,在其他情况下,操作系统可能会改变延迟套接字的数量。

。只是一个猜测,但从您的描述来看,线程的创建可能在线程关闭之前运行;你的可用端口已经用完了。然后,看起来您在终止线程之前正确地关闭了HTTP客户端,这应该可以避免这种情况。您的finally块很可能正在调用本机代码,而本机代码不存在;“在线程返回之前,您不能执行任何操作。@伯杰,非常好的建议,谢谢。方法A(当全局HttpClient在所有线程之间共享时)解决了我的问题。@Elliotterushyharold不确定真正的原因是什么,但全局HttpClient和MultiThreadConnManager已解决了我的问题。选择此答案作为接受答案,并且Berger的评论也是有用建议的一部分。谢谢