我正在开发一个应用程序,其中许多骆驼路线都作为Restlet路线公开。让我们称它们为端点。这些端点由角度应用程序消耗。这些端点调用第三方系统来收集数据,然后对它们进行处理后,将响应传递给角度应用程序。
有时候,第三方系统非常慢,在这种情况下,我们服务器的(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秒和几毫秒后给出响应。
最近几天我正在寻找类似的设置,但还没有任何东西。我想了解我做错了什么还是对文档的理解不正确。
此处使用的骆驼版本是2.23.0-快照
答案 0 :(得分:0)
您可以尝试使用Camel Hystrix通过Circuit Breaker模式来控制应用程序的下游调用,而不是尝试配置Camel组件的线程池。
一旦下游服务返回错误或响应速度太慢,您可以将替代响应返回给调用方。