Spring boot项目集成Camel FTP

1、Spring 中集成camel-ftp

近期项目中涉及到定期读取并解析ftp服务器上的文件,自己实现ftp-client有些复杂,而且还不知道要踩多少坑,因此考虑集成camel-ftp的方式来解决ftp文件的下载问题。自己则专注于文件的解析工作.

附上demo地址: https://github.com/LuckyDL/java-demos

1.1、POM引用

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-spring-boot-starter</artifactId>
    <version>2.22.1</version>
</dependency>
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-ftp</artifactId>
    <version>2.22.1</version>
</dependency>

  • 注意:
    在选择版本的时候,如果SpringBoot版本是1.5.10.RELEASE的话,那么camel的版本最高只能使用2.21.2,使用2.22版本将会报错。经测试的配套关系如下:
SrpingBoot Camel
1.5 <=2.21.2
2.0 >=2.22.x

其他情况都会出现错误.

1.2、SpringBoot application.yml配置

ftp:
  addr: 172.18.18.19:21    # ftp地址、端口
  name: ftpuser
  password: ftp2018
  options: password=${ftp.password}&readLock=rename&delay=10s&binary=true&filter=#zipFileFilter&noop=true&recursive=true
  url: ftp://${ftp.name}@${ftp.addr}/?${ftp.options}
  # 本地下载目录
  local-dir: /var/data

# 后台运行进程
camel:
  springboot:
    main-run-controller: true

management:
  endpoint:
    camelroutes:
      enabled: true
      read-only: true

配置说明:

  • delay:每次读取时间间隔
  • filter: 指定文件过滤器
  • noop:读取后对源文件不做任何处理
  • recursive:递归扫描子目录,需要在过滤器中允许扫描子目录
  • readLock:对正在写入的文件的处理机制

更多参数配置见官方手册

1.3、配置路由

要配置从远端服务器下载文件到本地,格式如下,from内部为我们在上面配置的url,to为本地文件路径。

@Component
public class DownloadRoute extends RouteBuilder {
    /** logger */
    private static final Logger logger = LoggerFactory.getLogger(DownloadRoute.class);

    @Value("${ftp.server.info}")
    private String sftpServer;

    @Value("${ftp.local.dir}")
    private String downloadLocation;

    @Autowired
    private DataProcessor dataProcessor;

    @Override
    public void configure() throws Exception{
        from(sftpServer)
                .to(downloadLocation)
                .process(dataProcessor)
                .log(LoggingLevel.INFO, logger, "Download file ${file:name} complete.");
    }
}

说明:

若将from配置为本地地址,to配置为远端地址,则可以实现向远端服务器上传文件

process是数据处理器,如果仅仅是下载文件到本地,那么就不需要该配置。

我们也可以配置多条路由也处理不同的业务,比如有多个ftp服务器需要连接的场景:

@Override
    public void configure() throws Exception{
        // route1
        from(sftpServer)
                .to(downloadLocation)
                .process(dataProcessor)
                .log(LoggingLevel.INFO, logger, "Download file ${file:name} complete.");
        // route2
        from(xxx).to(xxxx);

        // route3
        from(xxxx).to(xxx).process(xxx);
    }

1.4、配置文件过滤

如果ftp服务器上有很多文件,但是我们需要的只是其中的一种,由业务层来实现文件过滤肯定不合适,我们可以使用camel-ftp的文件过滤器,通过url中的filter来指定,如“filter=#zipFileFilter”, 用户需要实现GenericFileFilter接口的accept方法。
  例如我们只需要下载后缀名为.zip的压缩包到本地,过滤器的编写方法如下,因为我要递归扫描子目录,因此类型为目录的文件也需要允许通过。

/**
 * camel ftp zip文件过滤器
 */
@Component
public class ZipFileFilter implements GenericFileFilter {

    @Override
    public boolean accept(GenericFile file) {
        return file.getFileName().endsWith(".zip") || file.isDirectory();
    }
}

1.5、文件处理器

文件处理器就是我们对下载到本地的文件进行处理的操作,比如我们可能需要对下载的文件重新规划目录;或者解析文件并进行入库操作等。这就需要通过实现Processer的process方法。

本文中的demo就是通过processor来解析zip包中的文件内容:

@Component
public class DataProcessor implements Processor {

    /** logger */
    private static final Logger logger = LoggerFactory.getLogger(DataProcessor.class);

    @Value("${ftp.local-dir}")
    private String fileDir;

    @Override
    public void process(Exchange exchange) throws Exception {
        GenericFileMessage<RandomAccessFile> inFileMessage = (GenericFileMessage<RandomAccessFile>) exchange.getIn();
        String fileName = inFileMessage.getGenericFile().getFileName();
        String file_path = fileDir + '/' + fileName;
        readZip(file_path);
    }

    ...   // 省略数据处理方法
}

2、参考资料

关于camel ftp的各个参数配置,参见官方手册:http://camel.apache.org/ftp2.html

此处需要注意的是,camel ftp手册里面只写了ftp独有的一些配置项,camel-ftp组件继承自camel-file,手册里面有说明,就一句话,稍不注意就可能忽略了,笔者就是没注意,被递归扫描子目录的问题折腾了2天(╥﹏╥ 阅读文档要细心,可能原作者字字珠玑)。。。因此有一些参数配置项可能在camel-ftp手册里面找不到,请移步至:http://camel.apache.org/file2.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • 1、Spring 中集成camel-ftp   近期项目中涉及到定期读取并解析ftp服务器上的文件,自己实现ftp...
    佚名桑阅读 3,990评论 0 10
  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 3,754评论 0 5
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 4,867评论 0 9
  • 运行操作 CMD命令:开始->运行->键入cmd或command(在命令行里可以看到系统版本、文件系统版本) CM...
    小沐子_IT阅读 1,962评论 0 4
  • 运行操作 CMD命令:开始->运行->键入cmd或command(在命令行里可以看到系统版本、文件系统版本) CM...
    小明yz阅读 2,624评论 0 8