【问题标题】:What could be the root cause of this java.net.ConnectException, and how to resolve it?这个 java.net.ConnectException 的根本原因是什么,以及如何解决它?
【发布时间】:2018-07-25 08:56:53
【问题描述】:

上下文

我正在尝试在 Java Enterprise 应用程序(部署在 Wildfly 8.2 应用程序服务器上)中打开与网站的 HTTP 连接。我使用一个相当标准的工具来做到这一点——Jsoup 库。 大部分时间,连接打开没有问题,我可以读取和解析网站内容(用于进一步处理)。

但是,如果一旦打开失败(超时) - 它将永远不会再次成功,直到应用程序完全重新启动。任何打开与同一网站的连接的尝试都将再次失败并出现相同的异常。好像应用程序记住了网站的无法访问状态,并坚持这个假设,没有再试一次。 (我相当有信心,即使网站可以访问,应用程序仍然会一次又一次地抛出这个异常。)

例外

Caused by: java.net.ConnectException: Connection timed out: connect
    at java.net.TwoStacksPlainSocketImpl.socketConnect(Native Method) [rt.jar:1.8.0_31]
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) [rt.jar:1.8.0_31]
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) [rt.jar:1.8.0_31]
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source) [rt.jar:1.8.0_31]
    at java.net.PlainSocketImpl.connect(Unknown Source) [rt.jar:1.8.0_31]
    at java.net.SocksSocketImpl.connect(Unknown Source) [rt.jar:1.8.0_31]
    at java.net.Socket.connect(Unknown Source) [rt.jar:1.8.0_31]
    at sun.net.NetworkClient.doConnect(Unknown Source) [rt.jar:1.8.0_31]
    at sun.net.www.http.HttpClient.openServer(Unknown Source) [rt.jar:1.8.0_31]
    at sun.net.www.http.HttpClient.openServer(Unknown Source) [rt.jar:1.8.0_31]
    at sun.net.www.http.HttpClient.<init>(Unknown Source) [rt.jar:1.8.0_31]
    at sun.net.www.http.HttpClient.New(Unknown Source) [rt.jar:1.8.0_31]
    at sun.net.www.http.HttpClient.New(Unknown Source) [rt.jar:1.8.0_31]
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source) [rt.jar:1.8.0_31]
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(Unknown Source) [rt.jar:1.8.0_31]
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source) [rt.jar:1.8.0_31]
    at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source) [rt.jar:1.8.0_31]
    at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:449) [jsoup-1.8.1.jar:]
    at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:434) [jsoup-1.8.1.jar:]
    at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:181) [jsoup-1.8.1.jar:]
    at org.jsoup.helper.HttpConnection.get(HttpConnection.java:170) [jsoup-1.8.1.jar:]

问题

  • 这可能是 Wildfly 错误吗?
  • 这个问题可以在应用服务器内部解决吗?例如,调整配置参数、设置 HTTP 连接池(是否存在这样的事情?)
  • 在 Java Enterprise 应用程序中打开 HTTP 连接(即:使用非托管、非事务性资源)是否正确?
  • 我还能如何访问仅通过 HTTP 可用的内容? (除了打开连接)
  • 开发 JCA 适配器能否解决此问题?
  • 这样的 JCA 适配器是否已经存在? (我不可能是唯一一个遇到这个问题的人......)

【问题讨论】:

  • 你能把你写的代码提供给我吗?我认为您在执行期间抛出任何异常后释放线程。不监控代码的确切答案是不可能的。

标签: jakarta-ee wildfly jca


【解决方案1】:

您可能遇到了 dns 兑现 jdk 的问题,并且与 wildfly 本身有关。

尝试设置 networkaddress.cache.ttl 或 networkaddress.cache.negative.ttl 系统属性来控制 dns 缓存的行为。

更多详情这个见https://docs.oracle.com/javase/7/docs/technotes/guides/net/properties.html

【讨论】:

  • 有见地的评论。但是,我的应用程序无法访问的 URL 是由其 IP 地址指定的。这种异常还能归咎于 DNS 缓存吗?
【解决方案2】:

事实证明,(在这种特定情况下)网络配置不正确。不仅 JVM,其他几个程序也遇到了网络问题。

【讨论】:

    猜你喜欢
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多