0

私は、コア Java と Spring 2.5 を使用するフレームワークを持っています。これは、UNIX 環境でいくつかの sftp スクリプトを呼び出して、ファイルを宛先サーバーにアップロードします。現在、呼び出しごとに 1 つのファイルのアップロードのみがサポートされています。複数ファイルのアップロードをサポートするようにフレームワークを拡張することを担当しています。ただし、複数のファイルを sftp する場合、何らかの理由で、より少ない数のファイルを sftp した後にスクリプトが失敗した場合、プログラムの次の呼び出しでは、残りのファイルのみを sftp しようとする必要があります (すべてのファイルを再試行するのではなく、追加機能として)。たとえば。最初の呼び出しで、プログラムが 5 つのファイルを sftp するはずで、2 つのファイルを sftp した後に失敗した場合、次の呼び出しで残りの 3 つのファイルのみを sftp するオプションがあるはずです。考えられる解決策として、いくつかのキャッシュ エントリの更新や db テーブルの更新など、複数のオプションがありますが、それは解決策としては許可されていません (現在のところ、その理由について議論するのに多くの時間を費やしていません)。私は別の解決策を考えることができます.fileに書き込み、正常に転送されたファイルの名前を書き、残りのファイルを続行します。ただし、これはより大まかな解決策のようであり、十分に一般的なより良い解決策を考えています。この状況でのより良い設計についてアドバイスをお願いできますか? このすべての 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 に答える