骆驼 - 内容丰富:enrich()vs pollEnrich()

时间:2013-09-30 15:47:55

标签: activemq apache-camel

第1条问题:

我无法真正理解enrich()pollEnrich()之间的区别。也许Camel使用的术语不太好。

我在这里阅读:http://camel.apache.org/content-enricher.html

  

使用丰富的DSL元素进行内容丰富

     

Camel带有两种丰富的DSL内容

     
      
  • 富集
  •   
  • pollEnrich
  •   
     

enrich使用Producer来获取其他数据。通常是这样的   用于请求回复消息,例如用于调用外部消息   网络服务。另一方面,pollEnrich使用轮询消费者   获取其他数据。它通常用于事件消息   消息传递,例如读取文件或下载FTP文件。

我不明白其中的区别。他们似乎都通过消费来获得额外的数据(Web服务响应,FTP文件)。那么为什么他们说Web服务响应是由“生产者”完成的呢?

2ND问题:

在“骆驼在行动”一书中。 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 个答案:

答案 0 :(得分:13)

区别在于:

  • enrich假设您要将传入的Exchange用作另一个服务请求的参数。例如,您的传入Exchange可能是一个userID,但您确实需要整个User对象,因此您可以通过将userID传递给REST服务来enrich它,该服务返回成为Exchange的User对象等。< / p>

  • pollEnrich假设传入的Exchange是一个简单的触发器,它告诉PollingConsumer查找数据并创建Exchange(忽略传入Exchange的内容)。例如,您可能有一个计时器或其他业务流程事件,需要选择要处理的文件等,表示传入的Exchange数据不用于动态配置PollingConsumer ...只有URI用于此目的。

也就是说,从Camel 2.12开始,可以选择指定聚合策略来组合enrichpollEnrich的传入/返回交换

有关聚合策略的pollEnrich示例,请参阅this unit test