1、概要:
本項目主要是通過在Spring平台上配置Camel、FTP,實現定時從FTP服務器下載文件到本地、解析文件、存入數據庫等功能。
2、搭建空項目:
Spring Boot有幾種自動生成空項目的機制:CLI、Spring tool suite、網站Spring Initializr,我們選擇第三個。
- 訪問網站http://start.spring.io/,如下圖
- 在dependencies添加依賴包的時候,在框中輸入camle、jdbc、mysql會自動彈出提示,確認即為選中,如下圖:
- 點擊 generate project按鈕,生成項目,並將其導入到ecipse,在pom.xml中添加camel-ftp依賴,注意版本號選擇與camel-spring-boot-stater的相同
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-ftp</artifactId> <version>2.18.0</version> </dependency>
- 完整版的pom.xml文件如下:
<dependencies> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-spring-boot-starter</artifactId> <version>2.18.0</version> </dependency> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-ftp</artifactId> <version>2.18.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
- 待所有依賴jar下載到本地,基礎項目搭建完成
3、配置Camel完成從ftp服務器定時下載文件到本地
- 在application.properties中配置遠程FTP服務器的地址、端口、用戶名和密碼等信息
ftp.server.info=sftp://172.16.20.133:22/../home/temp/data?username=root&password=root&delay=5s&move=done&readLock=rename ftp.local.dir=file:C:/ftp/test
注意:sftp服務器的文件位置是相對於root登錄后的相對地址(被這里坑到了),delay=5s是每隔5秒鍾掃描ftp服務器上是否有新文件生成,如果有下載到本地,並將服務器上的文件轉移到done文件夾(/home/temp/data/done),readLock=rename可以阻止camel讀取正在被寫入的文件
- 配置路由,完成文件下載
@Component public class DownloadRouteDemo extends RouteBuilder { private static Logger logger = LoggerFactory.getLogger( DownloadRouteDemo.class ); @Value("${ftp.server.info}") private String sftpServer; @Value("${ftp.local.dir}") private String downloadLocation; @Override public void configure() throws Exception { from( sftpServer ).to( downloadLocation ).log(LoggingLevel.INFO, logger, "Downloaded file ${file:name} complete."); } }
注意:要繼承camel的RouteBulider,重寫configure方法,大意是從ftp服務器下載文件到本地,並輸出文件名(運行時所需必要信息都配置在application.properties文件中)
- 為了讓java進程在后台運行,需要在application.properties文件中增加如下配置
camel.springboot.main-run-controller=true
- 從ftp服務器下載文件的所有工作都已完成,運行CamelFtpSpringApplication.java,如果你的ftp服務器相應的位置上有文件,就會下載到本地所配置的文件夾下
4、通過camel定時解析本地文件並保存到數據庫
- 在application.properties中增加如下配置
route.parserfile.info = {{ftp.local.dir}}?delay=10s&move=done&readLock=rename route.parserfile.dir = {{ftp.local.dir}}/done
注意兩個花括號是引用其他變量的配置
- 編寫解析文件、入庫程序等處理器
@Component public class LocationFileProcessor implements Processor { private static Logger logger = LoggerFactory.getLogger( LocationFileProcessor.class ); @Value("${ftp.local.dir}") private String fileDir; @Autowired OrderService orderService;//業務邏輯處理組件 @Override public void process(Exchange exchange) throws Exception { GenericFileMessage<RandomAccessFile> inFileMessage = (GenericFileMessage<RandomAccessFile>) exchange.getIn(); String fileName = inFileMessage.getGenericFile().getFileName();//文件名 String splitTag = File.separator;//系統文件分隔符 logger.info(fileDir + splitTag + fileName);//文件的絕對路徑 orderService.process(fileDir + splitTag + fileName);//解析入庫等操作 } }
- 配置路由,完成業務邏輯的串聯
@Component public class LocalTransformRoute extends RouteBuilder { private static Logger logger = LoggerFactory.getLogger( LocalTransformRoute.class ); @Value("${route.parserfile.info}") private String location; @Value("${route.parserfile.dir}") private String locationDir; @Autowired LocationFileProcessor locationFileProcessor; @Override public void configure() throws Exception { from( location ).process( locationFileProcessor ).to( locationDir ).log(LoggingLevel.INFO, logger, "tirans file ${file:name} complete."); } }
注意,比上面的路由多了process配置,即業務邏輯處理配置
- 至此,所有工作都已完成,重新執行CamelFtpSpringApplication.java即可實現ftp文件定時下載、業務處理等(其中省去了很多,例如入庫操作等)