2010-11-16 33 views
8

我有一些代码连接到一个URL来下载文件,然后对它执行一些处理。但是,有时我收到错误java.net.SocketException: Connection reset异常情况以及重置连接时如何重试?

我想重新下载文件,当我收到这个错误,说最多3次放弃之前。我想知道什么是构建这个最好的方法。

以下看起来不错。将try-catch块放在while循环内似乎是可以接受的,或者有更好的方法吗?

所有帮助非常感谢!

while(!connected && retries > 0) { 
    retries--; 
    URL downloadUrl; 
    URLConnection conn; 

    try { 
    downloadUrl = new URL(url); 
    conn = downloadUrl.openConnection(); 
    conn.connect(); 
    connected = true; 
    // Perform processing on downloaded file here 

    } catch (IOException e) { 
    Logger.batchLog(e); 
    } 
} 

回答

1

我已经有线认为吞咽异常总是不好,但我想在这里,这是唯一的方法来告诉连接是否确实重置。我想你正在根据你的要求处理异常情况,这就是所有问题。

但是,我会,但是,让它,所以你不会吞下最后一个例外。如果它失败了三次,你会想重新抛出这个异常或以某种方式优雅地失败。

+0

那么这样的事情会好吗,还是处理事情的坏方法? catch(IOException e){ Logger.batchLog(e); (重试== 0){ throw e; } } – QuakerOat 2010-11-16 20:45:53

+0

是的。这应该是好的。或者,您可以终止并告诉用户服务器不可用,而不是抛出。但是,如果你处理它,你就不应该像发生任何事情一样吃掉异常。我认为你现在没有问题。此外,你只想捕获java.net.SocketException,而不是所有的IOExceptions,因为这是你知道如何处理的唯一的东西。 – shoebox639 2010-11-16 22:58:19

3

这是我宁愿让一个防弹连接池为我处理而不是自己写的东西。

-1

AOP和Java注释应该有所帮助。我建议从jcabi-aspects读造机制(我是一个开发者):

@RetryOnFailure(attempts = 3, delay = 5) 
public String load(URL url) { 
    return url.openConnection().getContent(); 
} 

你也可以尝试从RetryFuncCactoos