骆驼生产者消费混乱

时间:2014-12-21 21:26:29

标签: java apache-camel

Camel in Action书中对生产者和消费者的定义对我来说有点混乱。我已经读过类似问题的其他两个答案,但我仍然觉得不是这样。

  

生产者是引用实体能力的Camel抽象   创建消息并将消息发送到端点。数字   1.10说明了生产者适应其他Camel概念的位置。当需要将消息发送到端点时,生产者将会   创建一个交换并用与之兼容的数据填充它   特定的终点。例如,FileProducer将写入   消息正文到文件。另一方面,JmsProducer将映射   将Camel消息发送到JMS之前将消息发送到javax.jms.Message   目的地。这是骆驼的一个重要特征,因为它隐藏起来   与特定运输相互作用的复杂性。

     

消费者是接收由a生成的消息的服务   生产者,将它们包装在交换中,然后发送它们进行处理。   消费者是在Camel中路由交换的来源。   回顾图1.10,我们可以看到消费者所处的位置   与其他骆驼概念。为了创建一个新的交换,消费者会   使用包装正在使用的有效负载的端点。处理器是   然后用于在Camel中启动交换路由   路由引擎。

谁真正创建了一个交换?典型的沟通渠道的哪一方是生产者和消费者?从上面的文字中我无法确定谁对此负责。如果有人可以提供图片(书中的图片对我来说不清楚),那将是很好的,其中究竟是制作人和消费者,并解释他们如何以简单的方式工作。也许一些例子也很有用。

好吧也许最好举一个例子,有人可以告诉我它是如何运作的。 想象一下,我们想要从文件夹中获取文件并将它们放在JMS队列中 发送它们进行进一步处理,最终保存在磁盘上。

根据我的照片,生产者,消费者到底在哪里?我意识到什么是组件和端点。

2 个答案:

答案 0 :(得分:7)

或许the javadoc for Exchange class会为您澄清所有权。以下是回答关于谁创建Exchange的问题的片段:

  

消费者收到请求时会创建Exchange。创建一个新消息,将请求设置为消息正文,并根据消费者的其他端点和协议相关信息添加为消息的标题。然后创建一个Exchange,并将新创建的Message设置为Exchange上的in。因此,交易所在消费者中开始其生活。

答案 1 :(得分:7)

你或多或少对你的怀疑是正确的。举个简单的例子:

CamelContext camelContext = new DefaultCamelContext();
camelContext.addRoutes(new RouteBuilder() {
  @Override
  public void configure() {
    from("file:data/inbox?noop=true") // consumer
      .to("file:data/outbox");        // producer
  }
});
camelContext.start();
Thread.sleep(2000);
camelContext.stop();

在此示例中,我们使用RouteBuilder创建了Route,一旦CamelContext启动,就会执行如下操作:

  1. 创建两个FileComponent来表示这两个位置。
  2. 通过查询以前的组件来创建相应的FileEndpoint
  3. 创建FileConsumer以便从data/inbox
  4. 进行阅读
  5. 创建GenericFileProducer以写入data/outbox
  6. 将控制权移至FileConsumer以开始从其目录开始轮询文件,该文件指示其Endpoint创建Exchange(如图所示)。 GenericFileMessage绑定了Exchange
  7. Exchange已移交给FileProducer
  8. 从此视图中,Consumer不会创建任何交换。我想,在本书的这个阶段它还没有意义。这反映在文本中。但是,查看实现,当您查看代码时,两者都是等效的:

    Consumer在发送邮件时使用了一些Processor,在这种情况下,由Consumer表示,然后由Consumer查询以生成{Exchange 1}} Consumer查询其Endpoint,然后创建实际的Exchange