Тестирование существования файла с использованием Apache Camel - PullRequest
1 голос
/ 23 сентября 2019

Я хочу проверить, существует ли данный файл на удаленном SFTP-сервере с использованием Apache Camel.Метод должен возвращать истину, если существует, ложь, если нет, и исключение, если клиент не может подключиться (тайм-аут, неверное имя пользователя / пароль и т. Д.).

Фактически, чтобы проверить, могу ли я войти вСервер не является серьезной проблемой для проверки, существует ли данный файл.Просто отправьте запрос на SFTP-сервер download=false и noop=true

, и это почти то, что нужно сделать.Пустой файл будет загружен в мой каталог TMP, если файл существует, файл не будет загружен.Если я не могу войти на сервер, выдается собственное исключение (CannotConnectException).Я хочу сказать, что я не могу поймать это исключение у моего клиента.Я почти уверен, что делаю что-то не так, но не знаю что.Я думал, как обойти установку некоторого значения ошибки в возвращаемом файле - это случай, когда я не могу подключиться, но для меня это выглядит как «взлом».Есть ли способ поймать выброшенное исключение?Если нет, то как лучше всего получить исключение для моего клиента в случае, если я не могу подключиться?

Мой код выглядит следующим образом:

public final class MyFtpClient {
private static final Logger LOG = LoggerFactory.getLogger(MyFtpClient.class);

// Client settings
static String localPath = File.separator + "tmp";

public enum Existence{
    EXIST, NOT_EXIST, UNKNOWN      
}

private MyFtpClient() {
}

private static Existence doesFileExistAtServer(Main main, String protocol, String user, String password,
        String server, int port, String filePathAtServer, String filenameAtServer, String localPath) 
         {

    boolean fileExist = false;
    try {
        main.addRouteBuilder(new MyFtpClientRouteBuilder(protocol, user, password, server, port, filePathAtServer,
                filenameAtServer, localPath));
        main.start();
        Thread.sleep(5000);         
        main.stop();            
        String filePath = localPath + File.separator + filenameAtServer;

        File f = new File(filePath);
        fileExist = f.exists();

        if (fileExist) {
            f.delete(); // Just delete it.          
            return Existence.EXIST;
        } else {
            return Existence.NOT_EXIST;
        }

    // I CANNOT CATCH THIS EXCEPTION                
    } catch (Exception e) {
        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Cannot Connect to the Sftp Server " + server);
                  LOG.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Cannot Connect to the Sftp Server " + server);
                  LOG.info(e.getMessage());
                  return Existence.UNKNOWN;
    }       
}

public static void main(String[] args) throws Exception {
    String protocol = "sftp";
    int port = 22;
    String server;
    String user;
    String password;
    String filePathAtServer;
    String filenameAtServer;
    boolean fileExist;

    Main main = new Main();

    server = "unknown.com";
    user = "demo";
    password = "password";
    filePathAtServer = "/";
    filenameAtServer = "readme.txt";

    doesFileExistAtServer(main, protocol, user, password, server, port, filePathAtServer, filenameAtServer, localPath);
    LOG.info("\nThe accesibility of the file 1 " + filenameAtServer + " at the server " + server + " is " + fileExist + "\n")   
}

Тогда как мой RouteBuilder выглядит следующим образом:

public class MyFtpClientRouteBuilder extends RouteBuilder {
    private static final Logger LOG = 
    LoggerFactory.getLogger(MyFtpClientRouteBuilder.class);

    String protocol = "sftp";
    int port = 22;
    String server;
    String user;
    String password;
    String filePathAtServer;
    String filenameAtServer;
    String localPath;

    boolean fileExist;

    public MyFtpClientRouteBuilder(String protocol, String user, String password, String server, int port,
            String filePathAtServer, String filenameAtServer, String localPath) {

        super();

        this.protocol = protocol;
        this.user = user;
        this.password = password;
        this.server = server;
        this.port = port;
        this.filePathAtServer = filePathAtServer;
        this.filenameAtServer = filenameAtServer;
        this.localPath = localPath;

    }

    private static String generateFromUri(String protocol, String user, String password, String server, int port,
            String path, String filename) {

        final String downloadFalse = "download=false"; // NO, DO NOT Download the file
        final String fastExistsCheck = "fastExistsCheck=true";
        final String doNothing = "noop=true"; // Just connect, but DO NOTHING
        final String connectFail = "throwExceptionOnConnectFailed=true"; // Just in case a connection fails
        final String maxReconnect = "maximumReconnectAttempts=0";
        final String bridgeError = "consumer.bridgeErrorHandler=true";

        return protocol + "://" + user + "@" + server + ":" + port + path + "?" + "fileName=" + filename + "&"
                + downloadFalse + "&" 
                + "password=" + password 
                + "&" + fastExistsCheck 
                + "&" + connectFail 
                + "&" + doNothing
                + "&" + maxReconnect
                + "&" + bridgeError;
    }

    private static String generateLocalUri(String path) {

        final String protocol = "file";
        final String allowNullBody = "allowNullBody=true";
        final String doNothing = "noop=true";
        final String fileExist = "fileExist=move";
        final String moveExisting = "moveExisting=oldFile";

        return protocol + ":" + path + "?" + allowNullBody + "&" + doNothing + "&" + fileExist + "&" + moveExisting;
    }

    @Override
    public void configure() throws CannotConnectException {

        final String fromSftpServer = generateFromUri(protocol, user, password, server, port, filePathAtServer, filenameAtServer);
        LOG.info("From: " + fromSftpServer);

        final String toLocal = generateLocalUri(localPath);
        LOG.info("To: " + toLocal);

        onException(GenericFileOperationFailedException.class, JSchException.class)
                //.handled(true)
                .throwException(new CannotConnectException("Cannot connect to the remote SFTP server " + server))
                .log("Cannot connect to the remote SFTP server " + server)
                .maximumRedeliveries(0)             
                .to(toLocal)
                .continued(false)      // Either handled(true) or continue(false) but NOT both together
                .end();

        from(fromSftpServer).to(toLocal);

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...