返回基础知识:Apache Camel路由和直接组件
我对Camel路线及其两个端点感到困惑:Direct和Seda。 好吧,假设我有这样一条路线:
public void configure() { from("direct:services") .process(//Some processing here) .to("http://ThirdPartyServers") }
除此之外,我有一个restWeb服务,它接收多个请求,进行一些处理,然后将消息移交给此路由以从某些第三方服务器获得响应。 我通过Spring框架实例化了Camel Context,如下所示:
现在的问题是,我立即向这条路线发送了多条不同的消息。 现在Camel文档说直接组件在单线程中调用并且是同步的。 那么所有的消息会同时处理还是一个接一个的处理会发生?
此外,如果我将直接组件更改为seda,它会有任何区别吗?
TIA
更新[在Petter的回答之后] :尽管Petter的回答已经澄清,但我对同样的Direct和Seda组件有了新的疑问。 让我们说我的路线现在是这样的:
public void configure(){ from("direct:services") .choice() .when("some predicate here-Predicate1") .to("seda:predicate1") .otherwise() .to("seda:fallback") .end(); from("seda:predicate1") .process("some processing") .to("http://ThirdPartyServers"); from("seda:fallback") .process("some processing") .to("jms:fallbackqueue"); }
现在,如果我向不同线程的直接组件发送5条消息,那么这些消息将同时处理。 正如您在上面的路由中看到的,直接组件将消息发送到seda组件。 那么现在只有一个seda组件的线程将处理所有不同的5条消息? 最后的含义是什么消息将被逐个处理?
直接组件在调用者的线程中运行。 简化,它是一个常规的java方法调用。 只要多个线程正在调用直接端点,就可以在路由中运行多个消息。
在调用SEDA(或VM)端点时,您将消息放入队列(在内存中)。 另一个线程(在路由中)逐个从队列中选择消息并处理它们。 您可以通过设置concurrentConsumers选项来配置seda使用者应具有的线程数。 默认情况下,消耗消息的一个线程确保无论有多少线程生成此路由,一次只处理一条消息。
它归结为你的陈述
在一瞬间,我发送了多条不同的消息到这条路线
如果这意味着不同的线程,或者只是序列中的一个线程,
- Camel使用Simple DSL替换所有CRLF和LF
- Camel Splitter并行处理数组列表 – 并发访问问题
- Camel Restlet – 如何使用SSL公开服务
- Camel + Jackson:为所有反序列化注册一个模块
- org.apache.camel.NoTypeConversionAvailableException:没有类型转换器可用于转换类型:
- Apache Camel ftp使用者一次又一次地加载相同的文件
- OSGi容器中的Camel:将InterceptStrategy应用于所有驼峰上下文
- Camel NotifyBuilder总是返回false
- 无法通过Camel将日期字段保存为mongo db中的ISO日期?