Apache Camel 提供了两种使用线程池的解决方案:
from("seda:stageName?concurrentConsumers=5").process(...)
和
from("direct:stageName").thread(5).process(...)
我想知道,这两种解决方案有什么区别?是否只是两种写相同的东西?有哪些用例?
Apache Camel 提供了两种使用线程池的解决方案:
from("seda:stageName?concurrentConsumers=5").process(...)
和
from("direct:stageName").thread(5).process(...)
我想知道,这两种解决方案有什么区别?是否只是两种写相同的东西?有哪些用例?
提供异步 SEDA 行为,seda: component
以便在 BlockingQueue 上交换消息,并在与生产者不同的线程中调用消费者。
当direct: component
生产者发送消息交换时,提供对任何消费者的直接、同步调用。此端点可用于连接现有路由,或者如果与路由器位于同一 JVM 中的客户端想要访问路由。
线程池是一个可以在运行时根据负载动态增加/收缩的池,并发消费者始终是固定的。
就像,在你的情况下,
对于并发消费者- from("seda:stageName?concurrentConsumers=5").process(...)
对于线程池- from("direct:stageName").thread(5).process(...)
现在,如果您总是希望有 5 个线程可用,则使用Concurrent Consumers
,如果您希望线程根据负载可用(但不超过 5 个),则使用Thread Pool
.
并发消费者 默认情况下,SEDA 端点使用单个消费者线程,但您可以将其配置为使用并发消费者线程。因此,您可以使用以下方式代替线程池:
from("seda:stageName?concurrentConsumers=5").process(...) 至于两者的区别,请注意线程池可以在运行时根据负载动态增加/缩小,而并发消费者的数量总是固定的。
线程池 请注意,通过执行以下操作将线程池添加到 SEDA 端点:
from("seda:stageName").thread(5).process(...)
可以结束两个 BlockQueue:一个来自 SEDA 端点,一个来自线程池的工作队列,这可能不是您想要的。相反,您可能希望使用线程池配置 Direct 端点,该线程池可以同步和异步处理消息。例如:
from("direct:stageName").thread(5).process(...)
您还可以使用 concurrentConsumers 选项直接配置在 SEDA 端点上处理消息的线程数。