У моего приложения очень высокая средняя загрузка ЦП, причина в том, что на причале запускается много потоков для обработки запроса, и он может блокировать данные, когда данные готовы, многие потоки становятся работоспособными. Я хочу заставить причал ждать, пока все данные не будут прочитаны, а затем запустить поток для вызова сервлета, в этом случае сервлет никогда не будет заблокирован.

Это возможно?

1
Xilang 27 Дек 2016 в 05:25

1 ответ

Лучший ответ

Невозможно.

Jetty нужен поток для чтения самого тела содержимого запроса (для таких вещей, как mime multitpart, параметры формы и т. Д.), Или для использования этого потока для отправки в ваше веб-приложение, чтобы ваш сервлет прочитал тело содержимого запроса.

Затем есть дополнительная возможность асинхронного ввода-вывода (представленная в Servlet 3.1), которая позволяет вам писать сервлет, который использует поток только тогда, когда он может читать или записывать в сокет, позволяя потоку вернуться к ThreadPool, если ни один из них может быть сделано.

1
Joakim Erdfelt 27 Дек 2016 в 16:54
Я полагаю, причал должен иметь возможность использовать один поток для обработки множества соединений с NIO.
 – 
Xilang
28 Дек 2016 в 04:15
Если вы используете сервлеты, вы будете использовать асинхронный ввод-вывод, у вас нет доступа к слоям NIO в Jetty.
 – 
Joakim Erdfelt
28 Дек 2016 в 17:26
Да, я знаю, что не могу этого сделать, только ядро ​​причала может получить доступ к NIO. В любом случае, спасибо!
 – 
Xilang
29 Дек 2016 в 05:28