Apache Camel生产者和消费者

38

我难以理解这个概念。

我正在尝试实现一个端点,它侦听来自专有格式的传入消息的TCP端口,然后转换消息并使camel接管转发和路由。

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

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

在设置骨架实现的测试时,Camel在端点上调用了createProducer(),并在生产者对象上调用了process()。之后,它返回了,并没有对关联的消费者或处理器执行任何操作。

有人能指导我方向吗?

3个回答

66
重要的是要记住,由组件(即Endpoint Factory)创建的Endpoint可以位于Camel Route的任一端。如果将Component放在路由的起点,则必须有ComponentConsumer部分的实现。这部分工作将特定的输入/请求(如HTTP请求)转换为通用的“Camel Exchange”,以便其能够通过Route传输。而如果将Component放在route的末尾,则必须有一个Producer的实现。Producer的工作是将来自route末尾的Exchange转换为特定的内容(如JMS消息)。

我认为Fuse ESB文档比Apache Camel网站更好(总体而言)。从Fuse ESB Component page中得知:

Consumer endpoints消费请求。它们总是出现在路由的起点,并封装负责接收传入请求和发送传出响应的代码。

Producer endpoints生产请求。它们总是出现在路由的末尾,并封装负责发送传出请求和接收传入响应的代码。


enter image description here


6
感谢您提供清晰明了的解释。这些术语往往令人感到反直觉,因为使用 Camel 的典型用户通常会考虑路由和消息交换,而不是编写新的 Camel 组件。从消息交换的角度来看,这些术语使用方式是相反的。消费者会生成一个消息交换,而生产者会消费一个消息交换。 - dan carter
作为Camel的新手,我对这个答案感到非常困惑。如果我查看org.apache.camel.Producer接口,它指定的唯一契约是createExchange方法。而像EventDrivenPollingConsumer这样的东西所做的唯一事情就是使用Exchange进行处理。Exchange不是通过路由传递的吗?这就是Processors处理的内容,所以这是我的印象。 - Snekse
@Snekse 答案的描述部分确切地说明了这一点。但无论如何,我认为这种技术细节对于生产者和消费者的概念理解并没有太大的相关性。 - chrisjleu

22

我通过查看Stream组件,最终弄明白了问题。

原来我犯了一个错误,认为端点是一切必须经过的核心。

简单的答案是,消费者从外部系统接收数据(在我的情况下,是在服务器套接字上监听),生产者向外部系统发送数据。

由于我的端点只读(它不会被用作Camel路由过程的最终目的地),我真的不需要一个生产者(如果系统由于配置错误仍然尝试这样做,它应该抛出RuntimeException)。一个合适的例子是camel-atom端点 - 你可以读取feeds,但(截至1.6.0版本)你不能发布一个。

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


8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接