Camel - 内容丰富器:enrich() 与 pollEnrich()
Posted
技术标签:
【中文标题】Camel - 内容丰富器:enrich() 与 pollEnrich()【英文标题】:Camel - content enricher: enrich() vs pollEnrich() 【发布时间】:2013-10-06 13:36:24 【问题描述】:第一个问题:
我无法真正理解enrich()
和pollEnrich()
之间的区别。也许 Camel 使用的术语不是很好。
我在这里读到:http://camel.apache.org/content-enricher.html
使用丰富的 DSL 元素丰富内容
Camel 在 DSL 中提供了两种内容丰富器
丰富 投票丰富enrich 使用 Producer 来获取附加数据。通常是 用于请求回复消息,例如调用外部 网络服务。另一方面,pollEnrich 使用轮询消费者来 获取附加数据。它通常用于事件消息 消息传递,例如读取文件或下载 FTP 文件。
我不明白有什么区别。他们似乎都通过消费获得了额外的数据(Web 服务响应、FTP 文件)。那么为什么他们说获取 Web 服务响应是由“生产者”完成的呢?
第二个问题:
在“行动中的骆驼”一书中 p。 72 他们说:
Enrich 和 pollEnrich 无法访问当前交换中的信息
rich 和 pollEnrich 都不能利用任何信息 从目前的交易所。这意味着,例如,您不能 将文件名标题存储在 pollEnrich 的交换中以用于 选择一个特定的文件。如果骆驼在未来这可能会改变 团队可以找到解决方案。
但是,他们给出了一个类似于以下的代码示例,用于实现聚合策略:
public class ExampleAggregationStrategy implements AggregationStrategy
public Exchange aggregate(Exchange original, Exchange resource)
Object originalBody = original.getIn().getBody();
Object resourceResponse = resource.getIn().getBody();
Object mergeResult = ... // combine original body and resource response
if (original.getPattern().isOutCapable())
original.getOut().setBody(mergeResult);
else
original.getIn().setBody(mergeResult);
return original;
在这个例子中,我看到他们可以访问Exchange original
,这不是“当前交换”吗?如果不是,那么“原交易所”代表什么交易所?
他们所说的“当前交换”是什么意思?
【问题讨论】:
【参考方案1】:这里有区别:
enrich
假定您希望将传入的 Exchange 用作另一个服务请求的参数。例如,您传入的 Exchange 可能是一个用户 ID,但您确实需要整个用户对象,因此您可以 enrich
它通过将用户 ID 传递给返回成为 Exchange 的用户对象的 REST 服务等。
pollEnrich
假定传入 Exchange 是一个简单的触发器,它告诉 PollingConsumer 查找数据并创建一个 Exchange(忽略传入 Exchange 的内容)。例如,您可能有一个计时器或其他需要提取文件进行处理的业务流程事件,等等。也就是说,传入的 Exchange 数据不用于动态配置 PollingConsumer……只有 URI 用于此目的。
也就是说,从 Camel 2.12 开始,有一个选项可以指定聚合策略来组合 enrich
和 pollEnrich
的传入/返回 Exchange
请参阅this unit test 以获取具有聚合策略的 pollEnrich 示例
【讨论】:
以上是关于Camel - 内容丰富器:enrich() 与 pollEnrich()的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot + Apache Camel + Freemarker 自定义模板加载器
租户解析器的camelContext属性鉴别器,使用jpa多租户和camel routeId
JMS 选择器,用于在带有 Camel 和蓝图的一个标头中具有下划线的消息
Enrich Processor——Elasticsearch 跨索引关联数据新方式