• Apache Camel 与 Spring Boot 集成,通过FTP定时采集、处理文件 (转)


    1、概要:  

      本项目主要是通过在Spring平台上配置Camel、FTP,实现定时从FTP服务器下载文件到本地、解析文件、存入数据库等功能。  

    2、搭建空项目:

      Spring Boot有几种自动生成空项目的机制:CLI、Spring tool suite、网站Spring Initializr,我们选择第三个。

    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下载到本地,基础项目搭建完成

     3、配置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读取正在被写入的文件

    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文件中)

    3. 为了让java进程在后台运行,需要在application.properties文件中增加如下配置
      camel.springboot.main-run-controller=true
    4. 从ftp服务器下载文件的所有工作都已完成,运行CamelFtpSpringApplication.java,如果你的ftp服务器相应的位置上有文件,就会下载到本地所配置的文件夹下

     4、通过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配置,即业务逻辑处理配置

    4. 至此,所有工作都已完成,重新执行CamelFtpSpringApplication.java即可实现ftp文件定时下载、业务处理等(其中省去了很多,例如入库操作等)

    备注:只是camle spring ftp的一个演示demo,要运用于生产,还有好多需要完善的地方

    转载至:https://www.cnblogs.com/kanjiabin/p/5954833.html

  • 相关阅读:
    第十五周作业
    十三周作业
    第十三周上机作业
    第十二周作业
    第十二周作业
    第十一周作业
    第十一周上机作业
    第十次上机作业
    第九周上机作业
    安卓第一周
  • 原文地址:https://www.cnblogs.com/mh-study/p/10038328.html
Copyright © 2020-2023  润新知