Camel Restlet maxThreads 未按预期工作

Camel Restlet maxThreads not working as expected

我正在开发一个应用程序,其中许多 camel 路由被公开为 restlet 路由。让我们称它们为端点。这些端点由 angular 应用程序使用。这些端点调用第 3 方系统来收集数据,然后在处理它们之后,将响应传递给 angular 应用程序。

有时 3rd 方系统非常慢,在这种情况下,我们的服务器 (Websphere 8.5.5.9) 线程池达到其最大大小(因为它们中的大多数都在等待来自 3rd 方的响应).因此,应用程序的其他部分(不通过这些端点与服务器交互)没有可用的线程,因此它们也因此受到影响。

所以基本上我们想限制这些请求的数量 'endpoints' 如果服务器过载很大,这样应用程序的其他部分就不会受到影响。所以我们想研究可以处理任何端点上的传入请求的线程数。作为一个 poc(概念证明)来做到这一点,我使用了这个例子 https://github.com/apache/camel/tree/master/examples/camel-example-restlet-jdbc

在这个例子中我更改了以下配置

<bean id="RestletComponentService" class="org.apache.camel.component.restlet.RestletComponent">
    <constructor-arg ref="RestletComponent" />
    <property name="maxQueued" value="0" />
    <property name="maxThreads" value="1" />
</bean>

并且在

org.apache.camel.example.restlet.jdbc.MyRouteConfig

我在其中一条 get direct 路线上添加了 20 秒的睡眠,如下所示:

      from("direct:getPersons")
        .process(exchange -> { Thread.sleep(20000);})
        .setBody(simple("select * from person"))
        .to("jdbc:dataSource");

现在我的假设(我从 http://camel.apache.org/restlet.html 的骆驼文档中了解到)是在给定时间只能处理 1 个请求,并且不会接受其他请求(因为 maxQueued 设置为 0)当原始请求仍在处理中时。但这并没有真正发生。使用此代码,我可以同时多次调用此端点,并且所有端点都在 20 秒和几毫秒后给出响应。

我正在搜索最近几天的类似设置,但我还没有找到任何东西。我想知道是我做错了什么,还是我对文档的理解不正确。

这里使用的Camel版本是2.23.0-SNAPSHOT

您可以尝试使用 Camel Hystrix to control the downstream calls of your application with the Circuit Breaker 模式,而不是尝试配置 Camel 组件的线程池。

一旦下游服务 return 出错或响应太慢,您可以 return 对调用方的替代响应。