首页 > 解决方案 > 如何在内容丰富()中使用骆驼的 Exchange setProperty?

问题描述

我有一条骆驼路线,可以根据一些 id 进行拆分和聚合。当检索到一个 id 时,将调用另一个端点以根据该 id 检索项目信息。检索项目信息后,我必须通过调用多个丰富()方法来丰富它。在第一个丰富方法中,我必须进行一些 xpath 处理,其中无法检索我将在交换中设置为属性的 primaryOrgId 值,不要担心 xpath 处理,我已经解决了,但我的问题是当我在第一个丰富内设置属性(primaryOrgId)。当路由转到第二个丰富部分时,属性值不会保持不变。当我记录 primaryOrgId 值时,“testValue”的原始值(这是在 direct:createSomeIds 路由中设置的)是显示的值而不是“

我正在使用基于 Fuse 6.2.1 的 Camel 2.15。

我去了骆驼网站,从http://camel.apache.org/content-enricher.html阅读了这部分内容。我不确定我是否理解如何实现......“为此,您必须在端点 URI 中设置文件名”.. 这段文字是在谈论标题,我认为它也适用于交换中的属性。

pollEnrich 或enrich 不会访问来自当前Exchange 的任何数据,这意味着在轮询时它不能使用您可能在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();

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

标签: apache-camel

解决方案


如果您进一步阅读,您会发现建议您改用RecipientList.AggregationStrategy

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

端点 URI 中的文件名设置仅适用于访问 FTP 或其他文件区域上的某个文件的情况。

编辑:

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

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


推荐阅读