多条骆驼路线会导致大量线程吗?

Joh*_*ray 0 java integration multithreading routes apache-camel

我会澄清我的问题。

我有一个任务来集成两个系统:一个为 html 提供服务的前端和一个为前端提供数据的后端。后端有一个非常大的 REST api,所以我必须使用多个路由。我计划使用单个骆驼上下文并将所有路线包装到其中。

<camelContext xmlns="http://activemq.apache.org/camel/schema/spring">
    <from uri="direct:data"/>
    <to uri="ahc:http://localhost/data"/>
    <!--And so on. More than 70 routes-->
</camelContext>
Run Code Online (Sandbox Code Playgroud)

然后,我计划按照隐藏中间件文章中的建议,在服务方法上使用 @Produce 注释来调用路由

public interface Service {
    String data();
}

public class MyBean {
    @Produce(uri = "direct:data")
    protected Service producer;

    public void doSomething() {
        // lets send a message
        String response = producer.data();
    }
}
Run Code Online (Sandbox Code Playgroud)

据我了解从这里这里获取的信息,我最终会在我的应用程序中增加 70 个线程(每条路线一个)。我担心它会导致严重的性能下降,而后端 api 会增长,线程数也会随之增长。这是正确的吗?如果这是真的,我如何避免这种情况?据我了解,在这种情况下我不能使用 ExecutorService 线程池。

提前感谢您的任何回答。

Cla*_*sen 5

不,您不会以每条路线结束一个线程。线程模块通常与消费者的线程模型(例如路由输入)相关联。

例如,使用计时器组件的路由将使用调度线程池(1 个线程)。并且 JMS 组件将使用 1 个或多个线程,具体取决于您是否设置 concurrentConsumers=N 等。

直接组件类似于直接方法调用,它使用调用者线程,因此该线程模型有 0 个新线程。

如果您所有的 70 条路由都使用 < to > 中的 AHC,那么您可能需要重用相同的端点,因此您可以重用 AHC 库的线程池。或者配置共享池以用于所有 AHC 端点的替代方法。

顺便说一句,这个问题也发布在骆驼用户论坛/邮件列表上:http : //camel.465427.n5.nabble.com/Can-multiple-camel-routes-cause-a-very-large-number-of-threads -tp5736620.html