java - Apache Camel 中 Seda 的并发消费者

标签 java multithreading concurrency apache-camel

我有一条如下所述的路线。该路由定期轮询目录并读取大尺寸的 .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 有点生锈,但我很确定

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

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

关于java - Apache Camel 中 Seda 的并发消费者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38420369/

相关文章:

java - 将 DialogFragment 中的属性设置到 MainActivity 中

c - 以亚微秒频率同步线程和测量性能的最佳方法

c - 非阻塞 native 文件访问 - C 中的单线程守护进程?

django - 使用 PostgreSQL 在 Django 中获取下一个工作项

java - 使用 USB 连接的 Zebra 打印机在 Windows 7 中打印 ZPL

java - 为什么我必须在 maven 项目中手动为 sql db 定义驱动程序

java - 实现树可写类

java - 进程 fork 、子进程等[Java]

java - 在不删除任何内容的情况下获取并发修改异常

ios - 在 performBlockAndWait block 内执行获取请求时核心数据死锁