【问题标题】:Concurrent consumers of Seda in Apache camelApache camel 中 Seda 的并发消费者
【发布时间】:2016-07-17 10:43:06
【问题描述】:

我有一条如下所述的路线。该路由定期轮询一个目录并读取一个大尺寸的 .csv 文件。然后它将文件分成 1000 行的块并将其发送到 seda queue(firstQueue)。我在这个 seda 队列上有 15 个并发消费者。

route.split().tokenize("\n", 1000).streaming().to("seda:firstQueue?concurrentConsumers=15").process(myProcessor).to("seda:secondQueue?concurrentConsumers=15").process(anotherMyProcessor);

1) 15 个并发消费者是什么意思 - 是否意味着 15 个线程从 seda 读取数据并将其传递给 myProcessor 的一个实例?还是创建了 15 个单独的 myProcessor 实例,每个实例都作用于同一数据副本?注意myProcessor是一个单例,如果我把它改成原型会发生什么。

2) 是否有可能任何两个或多个线程选择相同的数据并将其传递给myProcessor?还是保证不会有两个线程拥有相同的数据?

感谢您的快速响应。谢谢!

【问题讨论】:

  • 我使用的是相当旧版本的骆驼 - 2.10.1。有谁知道这个版本中的 seda 和 concurrentConsumers 是否存在问题,并且可能已在以后的版本中修复?

标签: java multithreading concurrency apache-camel


【解决方案1】:

我的骆驼有点生锈了,但我很确定

  1. 有 15 个线程正在运行。每个将从队列中读取一条消息并调用 myProcessor。我的处理器只有一个实例,因此您需要确保它是线程安全的。我从未尝试过它,但我不相信将范围更改为原型会产生任何影响。

  2. 两个线程不应从队列中获取相同的消息。在正常运行中,每条消息应该只处理一次。但是,在某些错误情况下,我会导致同一条消息被处理两次,最明显的情况是您在处理文件的过程中重新启动了应用程序。

【讨论】:

  • 感谢马特的回复。那么,既然 SEDA 基本上是一个“BlockingQueue”,是否可以确保没有两个线程拥有相同的消息副本?另外,一旦一个线程从队列中取出一条消息,该消息就会立即从队列中删除?
  • 是的,阻塞队列就是这样。一旦一个线程接收到一条消息,它就会立即从队列中移除,因此没有其他线程会接收到相同的消息。
  • 还有一个问题,即使我定义了 15 个 concurrentConsumer,我也只看到 1 个线程(由 myProcessor)处理消息。知道为什么会这样吗?
  • 恐怕我脑子里一团糟。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多