如何在内容rich()中使用Camel的Exchange setProperty?

时间:2018-09-19 09:19:52

标签: apache-camel

我有一条骆驼路线,可以根据一些ID进行拆分和汇总。检索到ID后,将调用另一个端点,以根据此ID检索项目信息。检索项目信息后,我必须通过在其上调用多个rich()方法来对其进行充实。在第一种富集方法中,我必须执行一些xpath处理,其中我将无法检索将在交换中设置为属性的primaryOrgId值,不必担心xpath处理,我已经解决了这个问题,但是我的问题是当我在第一个填充内设置属性(primaryOrgId)。路线到达第二富集部分时,属性值不会保留。当我记录primaryOrgId值时,“ testValue”的原始值(在direct:createSomeIds路径中设置)是显示的值,而不是在第1个丰富部分中设置的“ changeTheValueHere”。

我正在使用基于保险丝6.2.1的骆驼2.15。

我去了骆驼的站点,并从http://camel.apache.org/content-enricher.html阅读了这一部分。我不确定我是否知道该如何实现...“为此,您必须在 端点URI”。.此文本正在谈论标头,我认为它也适用于交换中的属性。

  

pollEnrich或rich不访问当前的任何数据   交换意味着在轮询时它不能使用任何现有的   您可能已在Exchange上设置的标头。例如,您不能设置   Exchange.FILE_NAME标头中的文件名,然后使用pollEnrich   仅使用该文件。为此,您必须在   端点URI。

这是我的代码:

from("direct:createSomeIds")
        .routeId("createSomeIds")
        .process(new IdCreatorProcessor()        
        .setProperty("primaryOrgId").constant("testValue")
    .split(xpath("/TempProjects/TempProject/Code/text()").namespaces(ns) , new IdStrategy())
        .to("direct:splitRouteById")
.end();

from("direct:splitRouteById")
        .routeId("splitRouteById")
        .to("direct:getProjectByID")
        .to("xquery:template/AllProjectToSingleProject.xq") //xquery template
        .convertBodyTo(Project.class)  
        .enrich("direct:getAdditionalInfo", new ProjectStrategy(ProjectStrategy.AggregatorType.AdditionalInfo))
        .enrich("direct:getSecondaryInfo", new ProjectStrategy(ProjectStrategy.AggregatorType.SecondaryInfo))
.end();

 from("direct:getAdditionalInfo")
//some xpath stuff here
        .setProperty("primaryOrgId").constant("changeTheValueHere")

 .end();

 from("direct:getSecondaryInfo")
        .log("Value of primaryOrgId = " + "${exchangeProperty.primaryOrgId}")

 .end();

如果您可以提供一些代码示例,那将很有帮助。

1 个答案:

答案 0 :(得分:0)

如果您进一步阅读本书,会发现建议您将RecipientListAggregationStrategy一起使用。

.recipientList("direct:getAdditionalInfo", "direct:getSecondaryInfo")
    .aggregationStrategy(new ProjectStrategy())

仅当您要访问FTP上的某些文件或其他文件区域时,端点URI中的文件名设置才适用。

编辑:

我现在看到您需要在第二个浓缩中的第一个浓缩中的财产。但是,如果您不打算在第一个丰富版本中修改消息正文,那么我实际上根本不需要它。

如果您实际上是在修改主体,则仍然可以使用RecipientList,但可以使用两个单独的主体,每个主体仅调用一个端点。