我有一条如下所述的路线。该路由定期轮询目录并读取大尺寸的 .csv 文件。然后,它将文件分成 1000 行的 block ,并将其发送到 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
是一个单例,如果我将其更改为原型(prototype)会发生什么。
2) 是否有可能任何两个或多个线程选取相同的数据并将其传递给 myProcessor
?或者是否保证两个线程不会拥有相同的数据?
感谢快速回复。谢谢!
最佳答案
我的 Camel 有点生锈,但我很确定
有 15 个线程正在运行。每个都会从队列中读取一条消息并调用 myProcessor。我的处理器只有一个实例,因此您需要确保它是线程安全的。我从未尝试过,但我不相信将范围更改为原型(prototype)会产生任何影响。
两个线程不应从队列中获取相同的消息。在正常运行中,每条消息应该只处理一次。但是,在某些错误情况下,我会导致同一条消息被处理两次,最明显的一个是您在处理文件的过程中重新启动应用程序。
关于java - Apache Camel 中 Seda 的并发消费者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38420369/