PowerJob 定时从SFTP下载文件踩的坑

一. 业务需求

SFTP上有多个目录, 每小时要下载一次文件, 每个目录的下载任务都是一个独立的工作流任务.
在这里插入图片描述

二.问题描述

手动执行每个任务可以正常执行, 但是当所有任务都开启定定时任务执行时(每小时执行一次),任务实例就会报错.
在这里插入图片描述

三.问题分析
  1. 查看服务端和worker端的日志, 并没有报错(此处有坑, 不报错并不代表没问题).

  2. 查看官方文档, 怀疑是多个任务并发的导致的.

  3. 分析服务端源码.(太TM费劲了😨, 最后再考虑)

  4. 在本地开发环境模拟多个任务同时执行.
    问题虽然复现了, 但是依然没有报错. 难道真的要读服务端源码吗? 人家也没报错呀, 开始抓狂了.请添加图片描述

    一天的时间就是这样反复测试中度过了😒~
    请添加图片描述

四.问题解决

程序员可能只有夜深人静的时候才会有灵感.(●’◡’●)
来吧, 把多个任务的cron修改为每10秒执行一次, 来个暴力测试🤬.
监控两端的日志, 突然看到worker端一部分日志似乎有问题.
在这里插入图片描述
看到了吗?不同的目录,ftp的连接信息竟然打印两次. 好像突然明白了什么, 难道是代码中打印了两行日志吗?我希望不是,因为此时我已经意识到问题原因了😮.
在这里插入图片描述
代码中只有一条打印信息,为什么会打印两条呐?大牛一看就明白了, 呵呵, 好像在夸自己😂.
这说明同一时刻有两个线程在执行这个方法, 而这个方法正好是连接SFTP的方法.
好吧,那就把方法设置为同步, 该 synchronized出场了.

    /**
     * 下载文件
     * @return 二进制流
     */
    public synchronized byte[] downloadFile(String filePath) {
        log.info("sftp下载文件 filePath{} 开始", filePath);
        connect();
        try (InputStream inputStream = sftp.get(filePath);) {
            //进入FTP服务器文件目录
            log.info("DownloadFile:{},success from sftp", filePath);
            log.info("ftp下载文件结束");
            // inputStream.readAllBytes(); jdk9
            return IOUtils.toByteArray(inputStream);
        } catch (SftpException | IOException e) {
            log.error("sftp下载文件失败");
            throw new FileSyncException("ftp下载文件失败");
        } finally {
            disconnect();
        }
    }
五.重启测试

请添加图片描述
在这里插入图片描述
请添加图片描述
终于可以去看世界杯了(2022卡塔尔世界杯:德国VS日本).
看看日耳曼如何虐小RB.

六.总结
  • 日志非常重要, 代码中一定要详细记录日志.
  • 要养成仔细看日志的习惯.不报错并不代表没问题.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值