0

我有一个使用 Core java 和 Spring 2.5 的框架,它在 unix 环境中调用一些 sftp 脚本来将文件上传到目标服务器。截至目前,它仅支持每次调用 1 个文件上传。我负责增强框架,使其支持多个文件上传。但是,对于要 sftp 的多个文件,如果由于某种原因,脚本在 sfting 较少数量的文件后失败,则程序的下一次调用应该只尝试 sftp 剩余的文件(作为附加功能,而不是重试所有文件)。例如。假设在第一次调用时,程序应该 sftp 5 个文件,并且在 sftp 2 个文件后失败,那么应该有一个选项可以在下一次调用中只 sftp 剩余的 3 个文件。作为一种可能的解决方案,我有多种选择,例如更新一些缓存条目或更新数据库表,但这是不允许的解决方案(到目前为止,我还没有花太多时间争论原因)。我可以想到另一种解决方案 - 写入文件,成功 sftped 的文件的名称并继续处理剩余的文件。然而,这似乎是一种更粗略的解决方案,我正在考虑一个更好的解决方案,它应该足够通用。您能否为这种情况提供一些更好的设计建议?请注意,对于所有这些 sftp,目标服务器不会将任何信息发送回源服务器。成功 sftped 的文件的名称并继续处理剩余的文件。然而,这似乎是一种更粗略的解决方案,我正在考虑一个更好的解决方案,它应该足够通用。您能否为这种情况提供一些更好的设计建议?请注意,对于所有这些 sftp,目标服务器不会将任何信息发送回源服务器。成功 sftped 的文件的名称并继续处理剩余的文件。然而,这似乎是一种更粗略的解决方案,我正在考虑一个更好的解决方案,它应该足够通用。您能否为这种情况提供一些更好的设计建议?请注意,对于所有这些 sftp,目标服务器不会将任何信息发送回源服务器。

问候, 拉马坎特

4

1 回答 1

0

您是否尝试过引发包含未正确 sftp 的文件的异常?

异常类可能如下所示:

import java.io.File;

public class SFTPBulkFailedTransportException extends RuntimeException {

    public SFTPBulkFailedTransportException(File[] untransmittedFiles){
        setUntransmittedFiles(untransmittedFiles);
    }

    public File[] getUntransmittedFiles() {
        return this.untransmittedFiles;
    }

    private void setUntransmittedFiles(File[] untransmittedFiles) throws IllegalArgumentException {
        this.untransmittedFiles = untransmittedFiles;
    }

    private File[] untransmittedFiles;

}

如果您对所有未传输的文件抛出此异常,则在捕获此异常时您可以访问它们。在批量传输文件的方法中会抛出此异常。

如果你把它们放在一起:

import java.util.ArrayList;
import java.util.List;

File[] filesToSend; // all files to send

 while(filesToSend.length != 0){

        try{
            sendbulk(filesToSend);
        }catch(SFTPBulkFailedTransportException exception){
            // assign failed files to filesToSend
            // because of the while loop, sendbulk is invoked again
            filesToSend = exception.getUntransmittedFiles();
    }
}


public void sendbulk(File[] filesToSend) throws SFTPBulkFailedTransportException{

    List<File> unsuccesfullFiles = new ArrayList<File>();

    for(File file : filesToSend){
        try{
            sendSingle(file);
        }catch(IllegalArgumentException exception){
            unsuccesfullFiles.add(file);
        }
    }

    if(!unsuccesfullFiles.isEmpty()){
        throw new SFTPBulkFailedTransportException( (File[]) unsuccesfullFiles.toArray());
    }
}

public void sendSingle(File file) throws IllegalArgumentException{
    // I am not sure if this is the right way to execute a command for your situation, but
    // you can probably check the exit status of the sftp command (0 means successful)
    String command = "REPLACE WITH SFTP COMMAND";
    Process child = Runtime.getRuntime().exec(command);

    // if sftp failed, throw exception
    if(child.exitValue() != 0){
        throw new IllegalArgumentException("ENTER REASON OF FAILURE HERE");
    }
}

我希望这有帮助。

于 2012-09-27T15:31:37.343 回答