通过调用shell脚本来上载多个文件

时间:2012-09-27 14:56:53

标签: java sftp

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

此致 Ramakant

1 个答案:

答案 0 :(得分: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");
    }
}

我希望这会有所帮助。