博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java使用sftp定时下载文件
阅读量:6294 次
发布时间:2019-06-22

本文共 4007 字,大约阅读时间需要 13 分钟。

hot3.png

添加依赖

com.jcraft
jsch
0.1.54

增加配置

sftp:    ip: 192.168.1.60    port: 22    timeout: 60000    retryTime: 3    admin:        username: admin        password: 2k3xrYjbd930.

代码示例

每天凌晨1点在多个用户目录中下载csv文件至本地tmp目录
@Servicepublic 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();    }}

转载于:https://my.oschina.net/tianshl/blog/1811017

你可能感兴趣的文章
对象的继承及对象相关内容探究
查看>>
Spring: IOC容器的实现
查看>>
Serverless五大优势,成本和规模不是最重要的,这点才是
查看>>
Nginx 极简入门教程!
查看>>
iOS BLE 开发小记[4] 如何实现 CoreBluetooth 后台运行模式
查看>>
Item 23 不要在代码中使用新的原生态类型(raw type)
查看>>
为网页添加留言功能
查看>>
JavaScript—数组(17)
查看>>
Android 密钥保护和 C/S 网络传输安全理论指南
查看>>
以太坊ERC20代币合约优化版
查看>>
Why I Began
查看>>
同一台电脑上Windows 7和Ubuntu 14.04的CPU温度和GPU温度对比
查看>>
js数组的操作
查看>>
springmvc Could not write content: No serializer
查看>>
Python系语言发展综述
查看>>
新手 开博
查看>>
借助开源工具高效完成Java应用的运行分析
查看>>
163 yum
查看>>
第三章:Shiro的配置——深入浅出学Shiro细粒度权限开发框架
查看>>
80后创业的经验谈(转,朴实但实用!推荐)
查看>>