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