Camel Restlet maxThreads未按预期工作



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

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

因此,基本上,如果服务器严重过载,我们希望限制这些"端点"提供的请求数量,这样应用程序的其他部分就不会受到影响。因此,我们想利用可以在任何端点上处理传入请求的线程数量。为了做到这一点,我使用了这个例子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

我在其中一条直达路线上添加了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来控制具有断路器模式的应用程序的下游调用,而不是尝试配置Camel组件的线程池。

一旦下游服务返回错误或响应太慢,您就可以向调用方返回替代响应。

最新更新