当前位置: 首页 > 面试题库 >

Java:由HTTP连接创建的等待连接线程存活的时间很长

赵英哲
2023-03-14
问题内容

我有一个服务器端代码,用于检查SOAP服务是否已启动。代码如下:

String response = "";

while (response.length() == 0) {
    try {
        final URL url = new URL("DummySoapServiceURL");
        final HttpURLConnection httpConnection = (HttpURLConnection) url.openConnection();
        InputStream inputStream = null;
        try {
            httpConnection.setRequestMethod("GET");

            inputStream = httpConnection.getInputStream();
            final byte[] buffer = new byte[BUFFER_SIZE];
            while (inputStream.read(buffer, 0, BUFFER_SIZE) != -1) {
                response = new String(buffer);
            }
        } finally {
            IOUtils.closeQuietly(inputStream);
            httpConnection.disconnect();
        }
    } catch (MalformedURLException e) {
        // error handling
    } catch (IOException e) {
        // error handling
    }
}

现在的问题是,每次检查都会创建大约3-4个连接线程。即使SOAP服务检查完成,这些线程仍然有效。线程转储的快照,这些线程看起来像:

"http-host/ip:port-11" prio=10 tid=0x00000000064f0000 nid=0x32cc waiting on condition [0x00002b54bc604000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000000d5093c78> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at org.apache.tomcat.util.net.NioEndpoint$DefaultThreadFactory$1$1.run(NioEndpoint.java:1249)
    at java.lang.Thread.run(Thread.java:744)
   Locked ownable synchronizers:
    - None

现在我不确定为什么这些连接线程正在等待/停放以及如何关闭它们。在我的代码中,打开的流被关闭,并且使用disconnect()断开连接。

我还尝试设置以下HTTP属性:

httpConnection.addRequestProperty("Connection", "close");

但这没有帮助。我怀疑在某个时候JAVA可能会关闭这些线程。但我不知道,何时何地?JDK版本是jdk1.7.0_51_x64。请让我知道,如何阻止这些连接线程号的建立?


问题答案:

已迁移整个实现以使用apache HTTP客户端,因为它具有特殊的API,可以实现更好的控制。但这没有帮助。即使使用Apache
HTTP客户端,我也可以看到这些等待的连接线程。

最终在redhat网站上找到有关JBOSS
HTTP连接器配置的提示
。为HTTP连接器配置了线程池,它解决了该问题:

<subsystem xmlns="urn:jboss:domain:threads:1.1"> 
    <thread-factory name="http-connector-factory" group-name="uq-thread-pool" thread-name-pattern="HTTP-%t" priority="9"/> 
    <unbounded-queue-thread-pool name="uq-thread-pool"> 
        <max-threads count="5"/> 
        <keepalive-time time="5" unit="seconds"/> 
        <thread-factory name="http-connector-factory"/> 
    </unbounded-queue-thread-pool> 
</subsystem>

<subsystem xmlns="urn:jboss:domain:web:2.2" default-virtual-server="default-host" native="false">

    <connector name="http" protocol="org.apache.coyote.http11.Http11NioProtocol" scheme="http" socket-binding="http" executor="uq-thread-pool"/> 
    ....
    ....


 类似资料:
  • 问题内容: 我必须在CSS中实现以下圆圈和线条组合,而且我正在寻找有关如何有效实现这一点的指针。圆和线应如下所示: 我能够像这样实现圈子: 但是这些线条对我来说很难理解。 圆的大小根据是否为活动步而变化,连接圆的线的颜色也根据状态而变化。我将如何完成? 问题答案: 您可以使用伪元素和相邻的同级选择器(~)来实现此效果,而无需额外的标记:

  • 数据库连接池在connection达到配置的上限后,会进入一段等待时间 如果一段时间后,仍没有办法获取到连接,就会抛出异常。 现在,想监控一下是不是存在因为连接池太小,导致线程大量排队等待连接的情况。 怎么能发现这些线程?或者怎么监控到这些线程在申请连接具体的等待时间?

  • 我已经做了所有的尝试,但都不起作用,这是我的问题,我试图将一些文件从一台机器发送到另一台机器,想法是在目标机器上创建一个servlet,在服务器上运行它,并等待任何客户机连接,客户机和servlet代码在lan网络类型中完美地工作,但当涉及到wan网络类型时,我得到了这个例外 线程“main”org.apache.http.conn.HTTPhostConnectException:连接到192.

  • 给出结果需要20多秒,而在mongo控制台中同样的查询需要不到一秒。 为什么会出现这种情况,如何减少速度差距?

  • 本文向大家介绍HTTP长连接、短连接?相关面试题,主要包含被问及HTTP长连接、短连接?时的应答技巧和注意事项,需要的朋友参考一下 在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个W

  • 所以HTTP。1版本及以上版本支持持久性连接。 现在,我们正在创建一个Rest应用程序,它应该是无状态的。我们一次限制连接的数量。 但如果我仔细阅读HTTP1.0文档,这种方法似乎有问题。 它说服务器将保持连接打开,除非客户端说关闭。 所以,我的问题是如果客户端没有关闭怎么办?如果连接始终处于活动状态,它可能会给我拒绝服务错误。 什么是jetty的默认超时,我如何配置它?我无法找到合适的留档。