在java中重试FTPClient(apache commons net)上的连接

时间:2013-12-09 04:42:15

标签: java

以下是我的FTPClient重试方法。它有一个bug。当初始连接成功没有问题。但是如果2,3次尝试总是在NullPointerException中结束。显然连接在重试时是成功的,但是当我尝试列出远程文件时,它会抛出异常。

FTPClient ftpConnection(int in, FTPCon objGetFiles) {

    FTPClient  ftp = null;

    if (in < RetryCount) {
        try {
            in = in + 1;
            logger.debug("connecting .........");
            ftp = objGetFiles.connectToServer(FTPServer, FTPPort, FTPUser, FTPPasswd, RDir);
            logger.debug("connected and the ftp object is "+ftp);


        } catch (IOException ioe) {

            logger.debug(ioe.toString());
            logger.debug("sleeping for " + (RetrySleep / 1000) + " sec");
            try {
                Thread.sleep(RetrySleep);
                logger.debug("retrying connection");
                ftpConnection(in, objGetFiles);

            } catch (InterruptedException iex) {
                logger.debug(iex.toString());
            }

        }
    } else {
        logger.debug("maximum retry exceed.");
    }

    return ftp;

}

    DEBUG Starter - retrying connection
    DEBUG Starter - connecting .........
    DEBUG FTPCon - connecting to server ....
    DEBUG FTPCon - 230 Logged on
    DEBUG FTPCon - changing working directory
    DEBUG FTPCon - 250 CWD successful. "/tmp" is current directory.
    DEBUG Starter - connected and the ftp object is      org.apache.commons.net.ftp.FTPClient@51e2b2a6
    DEBUG Starter - java.lang.NullPointerException

    FTPFile n[] = ftp.listFiles();

上面是抛出NullPointerException的地方。我相信它在重试方法中的一个错误(因为初始连接总是工作正常),但到目前为止没有运气

1 个答案:

答案 0 :(得分:0)

您以递归方式调用ftpConnection(),但由于ftp的每次调用都有自己的ftpConnection(),因此您最终只返回顶级ftp-variable变量。您的重试调用生成的FTPClient - 对象会立即丢失,因为ftpConnection(in, objGetFiles)的结果未分配给变量。

快速修复

        try {
            Thread.sleep(RetrySleep);
            logger.debug("retrying connection");
            ftp = ftpConnection(in, objGetFiles);

        } catch (InterruptedException iex) {
            logger.debug(iex.toString());
        }

但我会考虑使用递归是否正确,或者循环对于这类问题是否更好。