“seda + concurrentConsumers”和“direct + threads”有什么区别

时间:2013-10-22 07:27:28

标签: java multithreading threadpool apache-camel

Apache Camel为使用线程池提供了两种解决方案:

from("seda:stageName?concurrentConsumers=5").process(...)

from("direct:stageName").thread(5).process(...)

我想知道,两种解决方案有什么区别?它只是两种写同样的东西吗?有什么用例?

2 个答案:

答案 0 :(得分:9)

SEDA组件

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端点上处理消息的线程数。