我正在用htmlunit开发一个web cralwer,我已经添加了所有必需的超时,但我注意到,当我使用Java VisualVM进行线程转储时,当某个已爬网网站的服务器没有响应时,应用程序会挂起:
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at java.net.SocksSocketImpl.readSocksReply(SocksSocketImpl.java:88)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:429)
at java.net.Socket.connect(Socket.java:525)
at com.gargoylesoftware.htmlunit.SocksSocketFactory.connectSocket(SocksSocketFactory.java:89)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:148)
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149)
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121)
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:573)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:425)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:776)
at com.gargoylesoftware.htmlunit.HttpWebConnection.getResponse(HttpWebConnection.java:152)
at app.plugin.core.net.QHttpWebConnection.getResponse(QHttpWebConnection.java:30)
at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseFromWebConnection(WebClient.java:1439)
at com.gargoylesoftware.htmlunit.WebClient.loadWebResponse(WebClient.java:1358)
at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:307)
at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:373)
at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:358)
这真的很令人沮丧,因为我无法控制那些服务器。这个问题严重影响了我的应用程序的性能。
问题:
如果您的Java服务器在Windows上,您的最后一招是SysInternals TCPView。
http://technet.microsoft.com/en-us/sysinternals/bb897437.aspx
从中,您将看到所有进程以及所有本地和远程端口的列表,其中包括您的Java应用程序。您必须选择正确的连接来关闭,然后Java线程将抛出异常并结束。
当然,有关闭错误连接的风险。毕竟,这种方法是最后的手段。
2019年8月23日更新:
当存在大量连接时,TCPView会变慢。
更快的替代方案是CurrPorts(来自NirSoft):https://www.nirsoft.net/utils/cports.html
以下是一篇可能与此相关的博文:http://javaeesupportpatterns.blogspot.fi/2011/04/javanetsocketinputstreamsocketread0.html
简而言之,解决方案是确保定义了套接字超时。默认值为0,表示没有超时。确切地说,这取决于库,在本例中显然是com。滴虫软件。htmlunit
。快速一看,正确的方法可能是com。滴虫软件。是的。网络客户。设置超时。
我相信,当您使用Java本机方法时,堆栈跟踪将显示RUNNABLE,即使调用实际上在等待某个事件时被阻止。本质上,我认为Java无法知道本机方法实际上在做什么,所以它会将这些调用标记为可运行。我已经在socketRead0()和socketAccept()中看到了这一点——这两个函数通常都会阻塞。
您需要将超时设置为合理的时间长度,这样,如果服务器没有响应,您的请求将超时,但如果服务器很忙,则不会太短。应用程序应该使用多线程编写。我会尝试运行十几个或更多线程,让每个线程等待最多五到十秒钟的响应。让几个线程等待几乎没有开销。在编写WebSpider时,还应注意不要用大量请求轰炸服务器。
问题内容: 包括: all Spring libs, Apache Tomcat 7.0 library 在构建路径中 但它仍然给出错误: 在“ org.sprintframework.web-3.1.0.M1.jar”中,我可以看到“ org.springframework.web.context.ContextLoaderListener”。 Google上的某个人说应该包含spring.ja
问题内容: 我使用非常简单的代码返回XML 但是,出现以下错误 请帮忙。谢谢 问题答案: 运行时出现NoSuchMethodError表示你使用的库版本与生成代码所针对的版本不同。 在你的情况下,Spring是元凶。在运行时检查类路径上的内容,并确保以下各项: 版本与编译时间罐相同 如果存在多个版本,请删除不需要的版本
问题内容: 我不明白注释和之间的实际区别是什么? 扩展名还是它们具有完全不同的含义?什么时候应该使用它们?在服务层中使用Spring ,在DAO 中使用javax? 谢谢回答。 问题答案: 几年前,Spring定义了自己的Transactional注释以使Spring bean方法具有事务性。 Java EE 7终于做了同样的事情,现在除了EJB方法外,还允许CDI bean方法是事务性的。因此,
我在CentOS虚拟机中安装了RabbitMQ,该虚拟机的网络适配器被定义为Bridge。我正在尝试配置RabbitMQ管理,以便通过机器的IP地址访问WebApp。配置如下:
这个FAQ的最新版本总是可以从Apache主站点得到,位于<http://httpd.apache.org/docs/2.2/faq/> 如果你的问题在这里没有找到答案,你也可以看看Apache 1.3 FAQ ,看你的问题是否在那里有了答案。 主题 背景 关于 Apache HTTP Server 的背景知识。 支持 我遇到问题该怎么办? 错误信息 这些错误信息是什么意思? 背景 什么是Apac
发布问题 更新问题 设置问题悬赏 获取问题列表 获取一个问题详情 删除一个问题 获取用户发布的问题列表 发布问题 POST /questions 输入 字段 类型 描述 subject 字符串 必须,问题主题或者说标题,不能超过 255 字节 ,必须以 ? 结尾。(不区分全角或者半角) topics 数组 必须,绑定的话题,数组子节点必须符合 { "id": 1 } 的格式。 body 字符串