首页 文章

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

提问于
浏览
7

1ST QUESTION:

我无法真正理解 enrich()pollEnrich() 之间的区别 . 也许Camel使用的术语并不是那么好 .

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

内容丰富使用丰富的DSL元素Camel自带两种内容丰富的DSL丰富的pollEnrich丰富使用Producer获取额外的数据 . 它通常用于请求回复消息传递,例如用于调用外部Web服务 . 另一方面,pollEnrich使用轮询消费者来获取附加数据 . 它通常用于事件消息消息传递,例如读取文件或下载FTP文件 .

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

2ND QUESTION:

在“骆驼在行动”一书中 . 72他们说:

Enrich和pollEnrich无法访问当前交易所的信息既不是富人也不是pollEnrich可以利用当前交易所的任何信息 . 这意味着,例如,您无法在交换机上存储文件头,以供pollEnrich用于选择特定文件 . 如果Camel团队能够找到解决方案,将来可能会发生变化 .

但是,他们提供了类似于以下的代码示例,用于实现聚合策略:

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 ,是不是"current exchange"?如果没有,那么"original exchange"代表什么交换?它们是什么意思"current exchange"?

1 回答

  • 13

    这是区别:

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

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

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

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

相关问题