Apache Camel 生产者和消费者
Posted
技术标签:
【中文标题】Apache Camel 生产者和消费者【英文标题】:Apache Camel producers and consumers 【发布时间】:2011-01-08 07:32:41 【问题描述】:我很难理解这个概念。
我正在尝试实现一个端点,它在 tcp 端口上侦听专有格式的传入消息,然后转换消息并让骆驼接管转发和路由。
我是否正确理解生产者负责将消息发送到Endpoint
而Consumer
从该端点接收它们?
在研究接口时,我无法弄清楚这些对象之间的消息流,尤其是在消费者部分。 Consumer
只定义了start()
和stop()
方法...
在框架实现上设置测试时,Camel
在端点上调用 createProducer()
,在生产者对象上调用 process()
。之后它返回,没有对消费者或与之关联的处理器做任何事情。
有人能指出我正确的方向吗?
【问题讨论】:
【参考方案1】:请务必记住,由 Component
(即端点工厂)创建的 Endpoint
可以位于 Camel Route
的任一端。如果您将 Component 放在路由的开头,则必须有 Component 的 Consumer
部分的实现。这会将特定的输入/请求(如 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 生产者和消费者的主要内容,如果未能解决你的问题,请参考以下文章
[Golang] kafka集群搭建和golang版生产者和消费者