Могу ли я вызвать основной канал nio для ответа в веб-приложении Jetty? - PullRequest
1 голос
/ 12 марта 2012

Я пишу веб-приложение, которое отправляет несколько простых файлов в ответ на некоторые запросы.Я хочу справиться с этим в Java, а не в nginx и др.В стандартном сервлете единственный вариант - использовать java.io.OutputStream из HttpServletResponse.

File file = ...
response.setContentLength((int)file.length());
FileInputStream in = new FileInputStream(file);            
IOUtils.copy(in, response.getOutputStream());  

. Копирует байтовые буферы больше, чем необходимо.Я хотел бы посмотреть, смогу ли я улучшить производительность, используя буферы и каналы NIO.Я знаю, что Jetty использует NIO под капотом, потому что «разъем» на моем сервере имеет класс org.eclipse.jetty.server.nio.SelectChannelConnector .

Есть ли способ получить доступ к базовым каналам из сервлета?Или есть способ определить специфичный для Jetty обработчик, который использует java.nio вместо java.io?

В их документах показан Jetty "hello world" обработчик , но это такжеиспользуя потоки HttpServletResponse и java.io.

Ответы [ 2 ]

1 голос
/ 12 марта 2012

Я бы взглянул на DefaultServlet, он уже делает что-то подобное, а также служит примером того, как сервлет может использовать прямые буферы для более эффективной работы со статическим ресурсом, подобным этому.

http://git.eclipse.org/c/jetty/org.eclipse.jetty.project.git/tree/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/DefaultServlet.java

Строка 758 является началом метода sendData.

Как правило, мы рекомендуем людям просто настроить DefaultServlet, если они заинтересованы в производительности при обслуживании статического контента, поскольку он также позволяет связываться с заголовками кэширования и тому подобным

удачи

0 голосов
/ 13 марта 2012

Копирует байтовые буферы больше, чем необходимо.

Нет, если используется режим потоковой передачи по частям.Когда вы делаете так, что байтовых буферов нет вообще, если только IOUtils.copy() не делает этого, в этом случае не используйте его, напишите 4 строки кода самостоятельно.

Причина байтовых буферов заключается в том, чтопопытается правильно задать заголовок ответа Content-Length, накапливая выходные данные в BB, а затем получая его размер перед отправкой заголовков, а затем содержимого BB в качестве тела.Устанавливая заголовок самостоятельно, я не думаю, что фактический эффект.

...