Spring boot項目集成Camel FTP

Spring boot項目集成Camel FTP

Spring boot項目集成Camel FTP


內容目錄

  • 1、Spring 中集成camel-ftp
  • 1.1、POM引用
  • 1.2、SpringBoot application.yml配置
  • 1.3、配置路由
  • 1.4、配置文件過濾
  • 1.5、文件處理器
  • 2、參考資料

1、Spring 中集成camel-ftp

近期項目中涉及到定期獲取讀取並解析ftp服務器上的文件,自己實現ftp-client的有些複雜,因此考慮集成camel-ftp的方式來解決ftp文件的下載問題。自己則專注於文件的解析工作.

demo: https://github.com/LuckyDL/ftp-camel-demo

1.1、POM引用

 

org.apache.camel
camel-spring-boot-starter
2.22.1


org.apache.camel
camel-ftp
2.22.1

  • 注意:
  • 在選擇版本的時候,如果SpringBoot版本是1.5.10.RELEASE的話,那麼camel的版本最高只能使用2.21.2,使用2.22版本將會報錯。經測試的配套關係如下:

SrpingBootCamel1.5<=2.21.22.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是數據處理器,如果僅僅是下載文件到本地,那麼就不需要該配置。

也可以配置多條路由也處理不同的業務:

@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 inFileMessage = (GenericFileMessage) exchange.getIn();
String fileName = inFileMessage.getGenericFile().getFileName();
String file_path = fileDir + '/' + fileName;
readZip(file_path);
}

... // 省略數據處理方法
}

關於camel ftp的各個參數配置,參見官方手冊:http://camel.apache.org/ftp2.html

此處需要注意的是,camel ftp手冊裡面只寫了ftp獨有的一些配置項,camel-ftp組件繼承自camel-file,手冊裡面有說明,就一句話,不注意就可能忽略了,筆者就是沒注意,被遞歸掃描子目錄的問題折騰了2天(閱讀要細心o(╥﹏╥)o)。。。因此有一些參數配置項可能在camel-ftp手冊裡面找不到,請移步至:http://camel.apache.org/file2.html

加Java架構師進階交流群獲取Java工程化、高性能及分佈式、高性能、深入淺出。高架構。性能調優、Spring,MyBatis,Netty源碼分析和大數據等多個知識點高級進階乾貨的直播免費學習權限 都是大牛帶飛 讓你少走很多的彎路的 群.號是:338549832 對了 小白勿進 最好是有開發經驗

注:加群要求

1、具有工作經驗的,面對目前流行的技術不知從何下手,需要突破技術瓶頸的可以加。

2、在公司待久了,過得很安逸,但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以加。

3、如果沒有工作經驗,但基礎非常紮實,對java工作機制,常用設計思想,常用java開發框架掌握熟練的,可以加。

4、覺得自己很牛B,一般需求都能搞定。但是所學的知識點沒有系統化,很難在技術領域繼續突破的可以加。

5.阿里Java高級大牛直播講解知識點,分享知識,多年工作經驗的梳理和總結,帶著大家全面、科學地建立自己的技術體系和技術認知!


分享到:


相關文章: