Java使用sftp定时下载文件

添加依赖

<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.54</version>
</dependency>

增加配置

sftp:
    ip: 192.168.1.60
    port: 22
    timeout: 60000
    retryTime: 3

    admin:
        username: admin
        password: 2k3xrYjbd930.

代码示例

每天凌晨1点在多个用户目录中下载csv文件至本地tmp目录
@Service
public class SftpTask extends Thread {

    private ChannelSftp sftp;

    private Session session;

    @Value("${sftp.admin.username}")
    private String username;

    @Value("${sftp.admin.password}")
    private String password;

    @Value("${sftp.host}")
    private String host;

    @Value("${sftp.port}")
    private Integer port;

    private SftpService sftpService;

    public EtlSftpTask (SftpService sftpService) {
        this.sftpService = sftpService;
    }

    /**
     * 建立sftp连接
     */
    private void connect(){
        try {
            JSch jSch = new JSch();

            session = jSch.getSession(username, host, port);
            session.setPassword(password);
            session.setConfig("StrictHostKeyChecking", "no");
            session.connect();

            Channel channel = session.openChannel("sftp");
            channel.connect();

            sftp = (ChannelSftp) channel;

        }catch (JSchException e) {
            e.printStackTrace();
        }
    }

    /**
     * 关闭sftp连接
     */
    public void close(){
        try {
            if (sftp != null) {
                if (sftp.isConnected()) sftp.disconnect();
            }
            if(session != null){
                if (session.isConnected()) session.disconnect();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 下载文件到本地
     *
     * @param source                    源文件
     * @param target                    目标文件
     * @throws SftpException            异常
     * @throws FileNotFoundException    异常
     */
    private void download(String source, String target) throws SftpException, FileNotFoundException {
        sftp.get(source, new FileOutputStream(new File(target)));
    }

    /**
     * 处理用户数据文件
     *
     * @param root      数据文件根目录
     * @param lastTime  上次处理文件的最后的时间
     * @return          本次处理文件的最后的时间
     */
    private Integer handle(String root, Integer lastTime) {
        String directory = root + "/event/";

        Vector files;
        try {
            files = sftp.ls(directory + "event_*.csv");
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }

        // 文件名
        String fileName;

        // 临时文件
        String tmpFile;

        // 文件更新时间
        Integer mTime;
        // 文件最后更新时间
        Integer maxTime = lastTime;

        // 处理用户文件
        for(Object o: files) {
            try {
                ChannelSftp.LsEntry f = (ChannelSftp.LsEntry) o;

                // 文件更新时间
                mTime = f.getAttrs().getMTime();

                if (mTime <= lastTime) continue;

                // 文件名
                fileName = f.getFilename();

                // 最后处理事件
                maxTime = Math.max(maxTime, mTime);

                // 下载文件
                tmpFile = "/tmp/" + fileName;
                download(directory + fileName, tmpFile);

            } catch (Exception e) {
                // TODO 错误日志
                e.printStackTrace();
            }
        }

        // 返回文件最后的处理时间
        return maxTime;
    }

    /**
     * 每天凌晨1点开始执行
     */
    @Scheduled(cron = "0 0 1 * * *")
    public void task () {

        // 获取sftp连接
        connect();

        String root;
        Integer lastTime;
        Long cid;

        Integer maxTime = lastTime;

        // 获取用户列表
        for (SftpDTO sftpDTO: sftpService.findAll()) {
            // 用户主目录
            root = sftpDTO.getSftpRoot();

            // 上次处理文件的最后时间
            lastTime = sftpDTO.getLastTime();

            maxTime = Math.max(maxTime, handle(root, lastTime));

            // 更新最后处理时间
            if (!maxTime.equals(lastTime)) {
                sftpDTO.setLastTime(maxTime);
                sftpService.update(sftpDTO);
            }
        }

        // 释放sftp资源
        close();
    }
}

猜你喜欢

转载自my.oschina.net/tianshl/blog/1811017