4

我对骆驼路线及其两个端点有点困惑:直接和塞达。好吧,假设我有一条这样的路线:

public void configure()
{
 from("direct:services")
  .process(//Some processing here)
  .to("http://ThirdPartyServers")
}

最重要的是,我有一个 REST Web 服务,它接收多个请求,进行一些处理,然后将消息移交给该路由以从某些第三方服务器获得响应。我已经通过这样的 Spring 框架实例化了 Camel Context:

<camelContext id="appCamelContext" xmlns="http://camel.apache.org/schema/spring"
        trace="true" streamCache="true">
        <propertyPlaceholder id="properties"
            location="classpath:camel.properties" />
        <camel:routeBuilder ref="oneRouteBuilder" />
        <camel:routeBuilder ref="photosRouteBuilder" />
</camelContext>

现在的问题是,我会立即向这条路线发送多条不同的消息。现在 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 条消息?到底意味着所有的消息都会被一一处理?

4

1 回答 1

4

直接组件在调用者的线程中运行。简而言之,它是一个常规的 java 方法调用。只要多个线程正在调用直接端点,就可以通过路由运行多条消息。

调用 SEDA(或 VM)端点时,您的消息被放入队列(在内存中)。另一个线程(在路由中)一个接一个地从队列中挑选消息并处理它们。您可以通过设置 concurrentConsumers 选项来配置 seda 使用者应具有的线程数。默认情况下,使用消息的一个线程确保一次只处理一条消息,无论有多少线程产生到该路由。

归结为你的陈述

瞬间我向这条路线发送了多条不同的消息

如果这意味着不同的线程,或者只是来自一个序列中的一个线程,

于 2013-05-02T07:03:54.357 回答