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

news2024/9/20 3:37:38

一. 业务需求

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.

六.总结

  • 日志非常重要, 代码中一定要详细记录日志.
  • 要养成仔细看日志的习惯.不报错并不代表没问题.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/31186.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ML特征工程】第 2 章 :简单数字的花式技巧

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

PDF怎么转换成Word?给大家分享三种简单的转换方法

我们怎么把拿到手的PDF文件转换成Word文档格式呢?众所周知,PDF文件虽然没有办法能够直接在文件上进行编辑,但是我们可以借助一些编辑软件来实现这一操作,尽管这样还是会有很多小伙伴习惯在Word中来编辑文件内容,因此怎…

EasyRecovery2023重新找回丢失的文件数据恢复软件

Ontrack EasyRecovery2023易恢复一款数据文件恢复软件,号称最好的数据恢复软件!可以全面恢复删除丢失数据,能对电脑误删文件恢复,格式化硬盘数据恢复,手机U盘数据恢复等等,威力非常的强大!支持恢…

运动耳机怎么选,盘点目前适合运动的几款耳机

​相对于传统耳机而言,现如今越来越多的人喜欢使用骨传导耳机,毕竟无需入耳不管是在运动还是日常,防丢能力会更加好,耳挂式的佩戴更加不用担心在剧烈运动的情况下脱落,但在骨传导耳机中已经有了很多个品牌入驻&#xf…

先聊聊「堆栈」,再聊聊「逃逸分析」。Let’s Go!

要搞清楚GO的逃逸分析一定要先搞清楚内存分配和堆栈: 内存分配既可以分配到堆中,也可以分配到栈中。 什么样的数据会被分配到栈中,什么样的数据又会被分配到堆中呢? GO语言是如何进行内存分配的呢?其设计初衷和实现原…

云原生丨5大Datadog集成,快速提高团队效率!

Datadog是DevOps、开发人员和 SRE 团队的必备好物,它适用于各种规模的云应用程序。 然而,尽管 Datadog 功能十分强大,但大多数企业并没有充分发挥 Datadog 全部价值。 什么是 Datadog Datadog 是一个可观察性平台,提供监控、安…

3.1、数据链路层概述

3.1、数据链路层概述 3.1.1、数据链路层在网络体系结构中所处的地位 如下所示,主机 H1 给主机 H2 发送数据,中间要经过三个路由器和电话网、局域网以及广域网等多种网络 从五层协议原理体系结构的角度来看: 主机应具有体系结构中的各个层…

使用HTML制作静态网站:传统文化戏剧锡剧带psd设计图(2个页面)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

【项目_01】搭建项目基本框架、底部tabbar、头部banner | 旅途拾景 | 基于Vue3全家桶

💭💭 ✨:搭建项目基本框架、底部tabbar、头部banner| 路途拾景 | 基于Vue3全家桶   💟:东非不开森的主页   💜: 因为很多东西来不及去做去看可是时间很快总是赶不上,所以要去成长呀&#x1f4…

作业-11.23

1、广播 接收端 #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <stdlib.h> #include <netinet/in.h> #include <netinet/ip.h> #include <arpa/inet.h> #include <unistd.h> #include <str…

Diffusion Autoencoders: Toward a Meaningful and Decodable Representation

​ Diffusion Autoencoders: Toward a Meaningful and Decodable Representation 扩散自编码器:面向有意义和可解码的表示 code&#xff1a;https://github.com/phizaz/diffae A CVPR 2022 (ORAL) paper (paper, site, 5-min video) Diffusion probabilistic models (DPMs) hav…

算法设计与分析 SCAU17089 最大m子段和

17089 最大m子段和 时间限制:1000MS 代码长度限制:10KB 提交次数:0 通过次数:0 题型: 编程题 语言: G;GCC;VC;JAVA Description “最大m子段和”问题&#xff1a;给定由n个整数&#xff08;可能为负&#xff09;组成的序列a1、a2、a3、…、an&#xff0c;以及一个正整数m&a…

【Java】初识IO流【附导航】

文章目录01 什么是IO02 数据源03 什么是流04 IO流原理⇩➩ 导航01 什么是IO 对于任何程序设计语言而言&#xff0c;输入输出&#xff08;Input / Output&#xff09;系统都是非常核心的功能。程序运行需要数据&#xff0c;数据的获取往往需要跟系统外部进行通信&#xff0c;外部…

论文复现|Panoptic Deeplab(全景分割PyTorch)

摘要&#xff1a;这是发表于CVPR 2020的一篇论文的复现模型。本文分享自华为云社区《Panoptic Deeplab(全景分割PyTorch)》&#xff0c;作者&#xff1a;HWCloudAI 。 这是发表于CVPR 2020的一篇论文的复现模型&#xff0c;B. Cheng et al, “Panoptic-DeepLab: A Simple, Str…

63. 不同路径 II

题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 现在考虑网格中有障碍物。那么从左上角到…

MySQL主/从-主/主集群安装部署

MySQL集群架构的介绍 我们在使用到MySQL数据库的时候&#xff0c;只是一个单机的数据库服务。在实际的生产环境中&#xff0c;数据量可能会非常庞大&#xff0c;这样单机服务的MySQL在使用的时候&#xff0c;性能会受到影响影响。并且单机服务的MySQL的数据安全性也会受到影响…

数字信号处理-09-串行FIR滤波器MATLAB与FPGA实现

前言 本文介绍了设计滤波器的FPGA实现步骤&#xff0c;并结合杜勇老师的书籍中的串行FIR滤波器部分进行一步步实现硬件设计&#xff0c;对书中的架构做了简单的优化&#xff0c;并进行了仿真验证。 FIR滤波器的FPGA实现步骤 从工程角度分析FIR滤波器的FPGA实现步骤如下&…

Vim简洁教程

Vim简洁教程Vim简介使用方法命令模式输入模式底线命令模式模式转换使用流程Vim键盘图Vim简介 在Linux系统中&#xff0c;Vim是一款自带的文本编辑器&#xff0c;因此Vim常用于Linux系统中。Vim是从 vi 发展出来的&#xff0c;包含代码补全、编译及错误跳转等方便编程的功能&am…

【LeetCode每日一题】——78.子集

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 数组 二【题目难度】 中等 三【题目编号】 78.子集 四【题目描述】 给你一个整数数组 nums &…

亚太C题详细版思路修改版(精)

今年的亚太A、B题的感觉难度不低&#xff0c;其难度已经可以与电工妈杯这种比赛的赛题难度相提并论了。因此&#xff0c;这次预计选C题的人数可能不少&#xff0c;这对于大家来说也是个好消息。塞翁失马焉知非福&#xff0c;难对于大家来说都难&#xff0c;只要自己放平心态&am…