首页 文章

返回基础知识:Apache Camel路由和直接组件

提问于
浏览
4

我对Camel路线及其两个 endpoints 感到困惑:Direct和Seda . 好吧,假设我有这样一条路线:

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

除此之外,我有一个休息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

Update [after Petter's answer] :尽管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条消息?最后的含义是什么消息将被逐个处理?

1 回答

  • 4

    直接组件在调用者的线程中运行 . 简化,它是一个常规的java方法调用 . 只要多个线程正在调用直接 endpoints ,就可以在路由中运行多个消息 .

    在调用SEDA(或VM) endpoints 时,您将消息放入队列(在内存中) . 另一个线程(在路由中)逐个从队列中选择消息并处理它们 . 您可以通过设置concurrentConsumers选项来配置seda使用者应具有的线程数 . 默认情况下,消耗消息的一个线程确保无论有多少线程生成此路由,一次只处理一条消息 .

    它归结为你的陈述

    在一瞬间,我向这条路线发送了多条不同的信息

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

相关问题