Я работаю над приложением, в котором множество верблюжьих маршрутов выставляются как маршруты рестлета. Позволяет называть их конечными точками. Эти конечные точки потребляются угловым приложением. Эти конечные точки обращаются к сторонней системе для сбора данных, а затем после их обработки передает ответ на угловое приложение.
Бывают случаи, когда сторонняя система работает очень медленно, и в таких случаях пул потоков нашего сервера (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-SNAPSHOT