Camel:如何基于模式交换来聚合文件

时间:2018-01-30 13:35:53

标签: apache-camel

我有一个课程来运行我的路线;输入来自队列(由执行查询的路由填充并将行作为消息插入队列中)

这些消息都包含几个标题: - pdu_id,基本上是对文件名的预取。 - pad:文件所在的路径

会发生什么:我希望文件位于tar中以" pdu_id"。*命名的路径中;之后,将执行REST调用以删除文档源。

我知道路线有来自;但基本上我需要一个带有动态"来自"的路线,如下面的代码示例所示,排队并不能解决问题。

问题是如何使用;我找不到类似的东西,但可能是我没有使用正确的谷歌搜索;在这种情况下,我非常抱歉。

public class ToDeleteTarAndDeleteRoute extends RouteBuilder {
    @Override
    public void configure() throws Exception 
    {
        from("broker1:todelete.message_ids.queue")
        .from("file:///?fileName=${in.header.pad}${in.header.pdu_id}.*")
        .aggregate(new TarAggregationStrategy())
        .constant(true)
        .completionFromBatchConsumer()
        .eagerCheckCompletion()
        .to("file:///?fileName=${in.header.pad}${in.header.pdu_id}.tar")
        .log("${header.pdu_id} tarred")
        .setHeader(Exchange.HTTP_METHOD, constant("DELETE"))
        .setHeader("Connection", constant("Close"))
        .enrich()
        .simple("http:127.0.0.1/restfuldb${header.pdu_id}?httpClient.authenticationPreemptive=true")
        .log("${header.pdu_id} tarred and deleted.");
    }

}

2 个答案:

答案 0 :(得分:0)

是。民意调查可以帮助您做到这一点。你应该使用这样的东西:

from("broker1:todelete.message_ids.queue")
        .aggregationStrategy(new TarAggregationStrategy())
        .pollEnrich()
        .simple("file:///?fileName=${in.header.pad}/${in.header.pdu_id}.*")
        .unmarshal().string()
        .to("file:///?fileName=${in.header.pad}/${in.header.pdu_id}.tar")
        .log("${header.pdu_id} tarred")
        .setHeader(Exchange.HTTP_METHOD, constant("DELETE"))
        .setHeader("Connection", constant("Close"))
        .enrich()
        .simple("http:127.0.0.1/restfuldb${header.pdu_id}?httpClient.authenticationPreemptive=true")
        .log("${header.pdu_id} tarred and deleted.");

答案 1 :(得分:0)

目前,该问题的解决方案包括基于@daBigBug所回答的一些变化。

  • pollEnrich的简单表达式使用antInclude而不是fileName;
  • 聚合物放在pollenrich之后;因为每个批处理是文件集,而不是队列的输入。队列中的输入仅根据要采取的操作提供元信息。
  • 在RouteBuilder中无法实现aggregationStrategy();我使用了aggregate()代替。

我删除了unmarshal();我不明白为什么需要这样做;文件可以包含二进制内容。

from("broker1:todelete.message_ids.queue")
.pollEnrich()
  .simple("file:${in.header.pad}?antInclude=${in.header.pdu_id}.*")
.aggregate(new TarAggregationStrategy())
    .constant(true)
    .completionFromBatchConsumer()
    .eagerCheckCompletion()
.log("tarring to: ${header.pad}${header.pdu_id}.tar")
.setHeader(Exchange.FILE_NAME, simple("${header.pdu_id}.tar"))
.setHeader(Exchange.FILE_PATH, simple("${header.pad}"))
.to("file://ignored")
...(and the rest of the operations);

我现在看到文件被拾取,甚至放在焦油中;但是,tar的文件名是意外的,因为它是位置(它放在./ignored中);此外,在其余操作中,交换标头似乎丢失了。

如果有人可以帮助弄清楚如何以安全的方式保存标题......我非常感激。我应该为此使用新问题,还是应该重新解释这个问题。