apache-camel - 如何在内容丰富()中使用骆驼的 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();
如果您可以提供一些代码示例,那将很有帮助。
解决方案
如果您进一步阅读,您会发现建议您改用RecipientList
.AggregationStrategy
.recipientList("direct:getAdditionalInfo", "direct:getSecondaryInfo")
.aggregationStrategy(new ProjectStrategy())
端点 URI 中的文件名设置仅适用于访问 FTP 或其他文件区域上的某个文件的情况。
编辑:
我现在看到您在第二次浓缩中需要第一次浓缩的财产。但是,如果您没有在第一次丰富中修改消息正文,那么我实际上根本不需要它。
如果您实际上是在修改主体,那么您仍然可以使用,RecipientList
但是您使用两个单独的主体,每个主体只调用一个端点。
推荐阅读
- mysql - 查找一列的重复项,但仅在另一列具有相同值时才返回结果
- shell - 如何在 IPython 控制台中获取 Shell 历史记录
- c++ - C++ google protobuf:如何从扩展的 FieldDescriptor 创建 MutableExtension
- windows - 如果文件夹名称包含 Unicode 字符,批处理将无法正常工作
- vue.js - 如何仅将 css 样式应用于特定的 Vue 组件及其子组件?
- vue.js - 数据库更新,但 Vuex 商店没有
- vue.js - 如何在mounted()上获取状态vuex并传递给数据?
- gradle - 嵌入式 Cassandra 单元测试,JUnit4.12 + Gradle4.9 运行到 NoSuchFileException
- django - 对象缓存具有相同 where 子句的多个查询
- amazon-dynamodb - DynamoDB 每个项目的生存时间