2017-02-18 21 views
0

Мой стек Tomcat8, с весной и JAX-RS (Джерси) на вершине его. Это предоставляет REST API, который будет использоваться конечным пользователем. В этих конечных точках REST мне нужно подключение сокета к древнему бэкэнду. Это дорого стоит настроить и уничтожить эти соединения сокетов для каждого запроса. Я хочу сохранить соединение в локальной переменной потока.Tomcat8/Spring/JAX-RS - Безопасно ли иметь локальные переменные потока в потоках http-bio-8080-exec-XYZ?

Чтобы это произошло, нам нужна гарантия того, что потоки http-bio-8080-exec- [identifier] никогда не будут убиты. Если это так, мы заканчиваем соединением со свисающим сокетом, которое никогда не будет закрыто. В конце концов, мы выйдем из доступных сокетов (утечка памяти).

Я проходил несколько документов, но не нашел ничего полезного. Итак, мой вопрос: будет ли поток пул за потоками только тех, кто будет расти, или он также сократится?

Другим вариантом является введение пула добрых объектов, который содержит соединения сокетов, но я думал, что локальный подход потока будет лучше, так как каждый запрос REST нуждается в этом соединении сокетов, поэтому размер пула будет равен то же самое, что и количество рабочих HTTP. Это хорошая причина использовать локаторы потоков вместо пула объектов, в данном случае?

ответ

0

Если это не задокументировано, чтобы быть безопасным, вы не можете предположить, что это возможно, или, по крайней мере, это может измениться между версиями Tomcat.

Количество потоков, создаваемых Tomcat, зависит от нагрузки на ваше приложение. Максимальное количество настраивается, и я действительно думаю, что он падает, а также при уменьшении нагрузки.

Однако вы можете использовать Фильтр, который получает Socket (существующий из пула или новый) в начале каждого запроса и устанавливает это в ThreadLocal (или с тех пор, как вы используете Spring, боб). Когда запрос завершается, ваш фильтр возвращает Socket в пул для повторного использования.