【问题标题】:JAVA: Interrupt Thread after so much time has passedJAVA:经过这么长时间后中断线程
【发布时间】:2011-07-06 17:02:33
【问题描述】:

我目前正在从事一个项目,要求我从 Internet 下载 WSDL 文件。

我的问题之外的一切都很好......

我使用以下代码:

private Definition getDefinition(String url) throws WSDLException {

    // Read the url and return an instance to a WSDL Definition
    return WSDLFactory.newInstance().newWSDLReader().readWSDL(url);

}

这个 WSDLFactory 是一个线程(据我所知)。我遇到的问题是,在我提供的 URL 列表中,其中一些指向不再存在的 WSDL。这反过来又导致我的程序在意识到它应该抛出 FileNotFoundException 之前等待非常长的时间。这是因为 WSDL 应该在的位置需要很长时间才能返回 HTTP_RESPONSE 代码。

有没有办法可以将这个 WSDLFactory 包装成试图获取 WSDL 但只给它 5-10 秒的时间?之后,它会说“你有太多时间来做这件事。我们正在踩你”?

【问题讨论】:

  • 你不能简单地从列表中删除不存在的资源吗?

标签: java multithreading time wsdl


【解决方案1】:

使用辅助线程,在 5 秒后在第一个线程上调用 interrupt() 方法。在第一个线程中处理 InterruptedException。

【讨论】:

    【解决方案2】:

    您可以尝试设置http超时sun.net.client.defaultConnectTimeout。当然这取决于WSDLReader的实现
    在这里检查: networking properties

    【讨论】:

      【解决方案3】:

      查看 Executor 和 Futures 框架。

      【讨论】:

        【解决方案4】:

        如果可能,设置底层套接字的超时 socket.setSoTimeout 或通过库中更高级别的配置选项。

        否则(如果您在类路径中有 Google 的番石榴)尝试:

        http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/util/concurrent/TimeLimiter.html

        【讨论】:

        • 我查看了这个选项,它看起来很有希望,但是我无法让它运行。我无法在网上找到任何工作示例。您以前使用过此代码吗?您能否提供一个实现 TimeLimiter 的简短示例?
        • 看一下实现类(链接在评论末尾)。您可以在Callable 上使用callWithTimeout,也可以创建代理。 guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/…
        猜你喜欢
        • 2017-03-22
        • 2016-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-04
        • 2016-12-13
        相关资源
        最近更新 更多