【问题标题】:Read file locations from table and copy to specific folder using pollEnrich()使用 pollEnrich() 从表中读取文件位置并复制到特定文件夹
【发布时间】:2016-02-08 23:06:07
【问题描述】:

我正在尝试编写一个骆驼路线,该路线读取数据库表以获取绝对文件路径列表,然后将这些文件复制到另一个文件夹。但是,只有文件路径被创建为内容,而不是原始内容。

    from("timer://testDataGen?repeatCount=1")
    .to("sql:" + positionSql + "?dataSource=dataSource")
    .split(body())
    .to("file://" + positionlistDir )
    .log("Finished copying the list of Files.")

请让我知道我在这里缺少什么来将绝对文件路径转换为实际文件。

更新 #1。

sn-p 下面调用 pollEnrich()。但是 pollEnrich() 正在复制文件数,该文件数等于 sql 返回的行数,而不是根据先前交换的文件名。

        String positionListSqlOptions = "?dataSource=dataSource";
//      String positionSrcDirOptions = "?noop=true&delay=500&readLockMarkerFile=false&fileName=${header.positionFileToBeCopied}";
        String positionSrcDirOptions = "?noop=true&delay=500&readLockMarkerFile=false&fileName=${body}";
        String positionStagingDirOptionsForWriting = "?doneFileName=${file:name}.DONE";

        from("timer://testDataGen?repeatCount=1")
        .to("sql:" + positionListSql + positionListSqlOptions)
        .split(body())
        \\ Getting the column value from the resultset which is a LinkedCaseInsensitiveMap and storing in the body
        .process(new positionFeederProcessor()) 
        .setHeader("positionFileToBeCopied", body())
        .pollEnrich("file://" + positionSrcDir + positionSrcDirOptions)
//      .pollEnrich().simple("file://" + positionSrcDir + positionSrcDirOptions)
        .to("file://" + positionStagingDir + positionStagingDirOptionsForWriting)
        .log("Finished copying the list of Files.");

我仍然无法获取传递给 pollingEnrich() 端点的实际文件名。我也尝试从正文以及标题中提取它。可能出了什么问题。

【问题讨论】:

    标签: apache-camel camel-sql


    【解决方案1】:

    好吧,我终于可以在完全不使用 pollEnrich() 的情况下做到这一点。

        String positionListSqlOptions = "?dataSource=dataSource";
        String positionSrcDirOptions = "?noop=true&delay=500&readLockMarkerFile=false&fileName=${header.CamelFileName}";
        String positionStagingDirOptionsForWriting = "?fileName=${header.position.file.name}&doneFileName=${file:name}.DONE";
    
        from("timer://testDataGen?repeatCount=1")
        .to("sql:" + positionListSql + positionListSqlOptions)
        .routeId("Copier:")
        .setHeader("positionFileList", body())
        .log("Creating the list of position Files ...")
        .split(body())
        .process(new PositionListProcessor())
        .setHeader("position.file.name", body())
        .setHeader("position.dir.name", constant(positionSrcDir))
        .process(new PositionFileProcessor())
        .choice()
            .when(body().isNull())
                .log("Position File not found. ${header.position.file.name}")
            .otherwise()
                .to("file://" + positionStagingDir + positionStagingDirOptionsForWriting)
                .log("Position File Copied from Src to : " + "${header.CamelFileNameProduced} ... ${headers} ...");
    

    这里是处理器。

    public class PositionListProcessor implements Processor {
    public void process(Exchange exchange) throws Exception {
        LinkedCaseInsensitiveMap positionFilesResultSet = (LinkedCaseInsensitiveMap) exchange.getIn().getBody();
        try {
            String positionFileStr = positionFilesResultSet.get("PF_LOCATION_NEW").toString();
            }
            exchange.getOut().setBody(positionFileStr.trim());
        } catch (Exception e) {     }
    } }
    
    
    
    
    public class PositionFileProcessor implements Processor {
    public void process(Exchange exchange) throws Exception {
        String filename = exchange.getIn().getBody(String.class);
        String filePath = exchange.getIn().getHeader("position.dir.name", String.class);
        URI uri = new URI("file:///".concat(filePath.concat(filename)));
        File file = new File(uri);
        if (!file.exists()) {
                logger.debug((String.format("File %s not found on %s", filename, filePath)));
            exchange.getIn().setBody(null);
        } else {
            exchange.getIn().setBody(file);
        }
    } }
    

    【讨论】:

      【解决方案2】:

      file 组件,当用于to 定义时,会生成一个包含交换内容的文件,它不会读取文件。例如,您可以使用pollEnrich 处理器:

      from("timer://testDataGen?repeatCount=1")
          .to("sql:" + positionSql + "?dataSource=dataSource")
          .split(body())
          .pollEnrich().simple("file:folder?fileName=${body}")
          .to("file://" + positionlistDir )
          .log("Finished copying the list of Files.")
      

      【讨论】:

      • 感谢您的回复。上面的 pollEnrich() 调用实际上没有工作。在 split() 调用之后没有处理消息。我让它以不同的方式工作,但不正确。在问题中编辑上面的代码..
      猜你喜欢
      • 2020-04-14
      • 1970-01-01
      • 1970-01-01
      • 2020-04-10
      • 1970-01-01
      • 2011-12-04
      • 1970-01-01
      • 1970-01-01
      • 2012-10-14
      相关资源
      最近更新 更多