Apache Camel 與 Spring Boot 集成,經過FTP定時採集、處理文件

一、概要:  

  本項目主要是經過在Spring平臺上配置Camel、FTP,實現定時從FTP服務器下載文件到本地、解析文件、存入數據庫等功能。  java

二、搭建空項目:

  Spring Boot有幾種自動生成空項目的機制:CLI、Spring tool suite、網站Spring Initializr,咱們選擇第三個。mysql

  1. 訪問網站http://start.spring.io/,以下圖
    spring initializer網站
  2. 在dependencies添加依賴包的時候,在框中輸入camle、jdbc、mysql會自動彈出提示,確認即爲選中,以下圖:
    選擇依賴包
  3. 點擊 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>

     

  4. 完整版的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>

     

  5. 待全部依賴jar下載到本地,基礎項目搭建完成

 三、配置Camel完成從ftp服務器定時下載文件到本地

  1. 在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讀取正在被寫入的文件spring

  2. 配置路由,完成文件下載
    @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文件中)sql

  3. 爲了讓java進程在後臺運行,須要在application.properties文件中增長以下配置
    camel.springboot.main-run-controller=true

     

  4. 從ftp服務器下載文件的全部工做都已完成,運行CamelFtpSpringApplication.java,若是你的ftp服務器相應的位置上有文件,就會下載到本地所配置的文件夾下

 四、經過camel定時解析本地文件並保存到數據庫

  1. 在application.properties中增長以下配置
    route.parserfile.info = {{ftp.local.dir}}?delay=10s&move=done&readLock=rename
    route.parserfile.dir = {{ftp.local.dir}}/done

    注意兩個花括號是引用其餘變量的配置數據庫

  2. 編寫解析文件、入庫程序等處理器
    @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);//解析入庫等操做
            
        }
    
    }

     



  3. 配置路由,完成業務邏輯的串聯
    @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配置,即業務邏輯處理配置apache

  4. 至此,全部工做都已完成,從新執行CamelFtpSpringApplication.java便可實現ftp文件定時下載、業務處理等(其中省去了不少,例如入庫操做等)

備註:只是camle spring ftp的一個演示demo,要運用於生產,還有好多須要完善的地方

相關文章
相關標籤/搜索