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