java - Camel ReSTLet maxThreads 未按预期工作

标签 java apache-camel restlet spring-camel

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

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

因此,基本上,如果服务器严重过载,我们希望限制这些“端点”所服务的请求数量,以便应用程序的其他部分不会受到影响。因此,我们想研究可以处理任何端点上传入请求的线程数量。为了将其作为 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

我在其中一条获取直接路由上添加了 20 秒的 sleep ,如下所示:

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

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

过去几天我一直在寻找类似的设置,但还没有找到任何东西。我想了解我是否做错了什么或者我是否错误地理解了文档。

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

最佳答案

您可以尝试使用Camel Hystrix,而不是尝试配置Camel组件的线程池。使用 Circuit Breaker 控制应用程序的下游调用图案。

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

关于java - Camel ReSTLet maxThreads 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53154822/

相关文章:

java - 何时使用 ReSTLet router v. Component with multiple routes

java - 如何使用 URL 参数使用 servlet ClientResource?

java - 在java中错误地逐行读取.txt文件

java - 有没有可能用camel监听sql表/字段?

java - 调整屏幕尺寸以进行 Selenium 测试

java - 如何在 apache camel + spring 中动态加载属性文件值

jms - Camel jms 请求/回复

.net - RESTLET 的 C# 或 .Net 客户端

java - |已将 MySQL Connector 添加到库中,但仍然收到错误 'java.lang.ClassNotFoundException: com.mysql.jdbc.driver'

java - 如何使用 Tomcat 上的 Grails 在我的网络应用程序(用于上传相册)中创建一个新文件夹?