Apache Camel 生产者和消费者

Posted

技术标签:

【中文标题】Apache Camel 生产者和消费者【英文标题】:Apache Camel producers and consumers 【发布时间】:2011-01-08 07:32:41 【问题描述】:

我很难理解这个概念。

我正在尝试实现一个端点,它在 tcp 端口上侦听专有格式的传入消息,然后转换消息并让骆驼接管转发和路由。

我是否正确理解生产者负责将消息发送到EndpointConsumer 从该端点接收它们?

在研究接口时,我无法弄清楚这些对象之间的消息流,尤其是在消费者部分。 Consumer 只定义了start()stop() 方法...

在框架实现上设置测试时,Camel 在端点上调用 createProducer(),在生产者对象上调用 process()。之后它返回,没有对消费者或与之关联的处理器做任何事情。

有人能指出我正确的方向吗?

【问题讨论】:

【参考方案1】:

请务必记住,由 Component(即端点工厂)创建的 Endpoint 可以位于 Camel Route任一端。如果您将 Component 放在路由的开头,则必须有 ComponentConsumer 部分的实现。这会将特定的输入/请求(如 HTTP 请求)转换为通用的东西 - Camel Exchange - 可以沿着Route 传播。而如果你将 Component 放在 route 的末尾,那么你必须有一个 Producer 的实现。 Producer 负责从 route 的末尾获取 Exchange 并将其转换为特定的东西(如 JMS 消息)。

我发现 Fuse ESB 文档(通常)比Apache Camel website 更好。来自Fuse ESB Component page:

消费者端点消费请求。它们总是出现在开头 一个路由,它们封装了负责接收的代码 传入请求和发送传出回复。

生产者端点产生请求。它们总是出现在结尾 一个路由,它们封装了负责调度的代码 传出请求和接收传入回复。


【讨论】:

很好的解释,谢谢。这些术语通常是违反直觉的,因为骆驼的典型用户正在考虑路由和消息交换,而不是创作一个新的骆驼组件。从 messageExchange 的角度来看,这些术语是错误的。 Consumer 产生 messageExchange,Producer 消费 messageExchange。 作为骆驼的新手,我对这个答案感到非常困惑。如果我查看org.apache.camel.Producer 接口,它指定的唯一契约是createExchange 方法。看看EventDrivenPollingConsumer 之类的东西,唯一与Exchange 相关的是process 它。 Exchange 不是通过路线旅行吗?这就是 Processors 的工作方式,这就是我的印象。 @Snekse 答案的描述性部分正是如此。但无论如何,我认为这种技术性与对生产者和消费者的概念理解没有太大关系。【参考方案2】:

通过查看 Stream 组件,我终于弄明白了。

事实证明,我错误地认为端点是一切都必须通过的中心。

简单的答案是消费者从外部系统接收数据(在我的例子中侦听服务器套接字),生产者将数据发送到外部系统。

由于我的端点是只读的(它不会用作 Camel 路由过程的最终目的地),我真的不需要生产者(如果系统由于配置错误而仍然尝试这样做,它应该抛出 RuntimeException )。一个合适的例子是骆驼原子端点——你可以阅读提要,但(从 1.6.0 开始)你不能发布一个。

同样,您只需要一个只写端点的生产者,它不从外部系统接收数据(例如日志记录)。

【讨论】:

【参考方案3】:

生产者扩展了处理器,这意味着它也有一个处理方法。

查看 Camel in Action 一书中的免费第 1 章,其中介绍了一些有关 Camel 概念的内容。 http://www.manning.com/ibsen/

而且本教程也非常出色,因为它以稳定的速度介绍了这些概念 http://camel.apache.org/tutorial-example-reportincident.html

【讨论】:

以上是关于Apache Camel 生产者和消费者的主要内容,如果未能解决你的问题,请参考以下文章

Java实现Kafka生产者和消费者的示例

[Golang] kafka集群搭建和golang版生产者和消费者

使用 ActiveMQ、Camel 和 Spring 实现请求-回复模式

Apache Camel:轮询消费者

如何使用Apache Kafka进行内容过滤?

Jms消费者模式