1. Обзор
В этой статье мы поговорим о программном создании и настройке экземпляра Jetty.
Jetty — это HTTP-сервер и контейнер сервлетов, разработанный как легкий и легко встраиваемый. Мы рассмотрим, как установить и настроить один или несколько экземпляров сервера.
2. Зависимости Maven
Для начала мы хотим добавить Jetty 9 со следующими зависимостями Maven в наш pom.xml
:
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>9.4.8.v20171121</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-webapp</artifactId>
<version>9.4.8.v20171121</version>
</dependency>
3. Создание базового сервера
Развернуть встроенный сервер с помощью Jetty так же просто, как написать:
Server server = new Server();
server.start();
Отключить его так же просто:
server.stop();
4. Обработчики
Теперь, когда наш сервер запущен и работает, нам нужно указать ему, что делать с входящими запросами. Это можно сделать с помощью интерфейса Handler .
Мы могли бы создать его сами, но Jetty уже предоставляет набор реализаций для наиболее распространенных вариантов использования. Давайте посмотрим на два из них.
4.1. Контекст веб-приложения
Класс WebAppContext
позволяет делегировать обработку запросов существующему веб-приложению. Приложение может быть предоставлено либо в виде пути к файлу WAR, либо в виде пути к папке веб-приложения.
Если мы хотим представить приложение в контексте «myApp», мы должны написать:
Handler webAppHandler = new WebAppContext(webAppPath, "/myApp");
server.setHandler(webAppHandler);
4.2. HandlerCollection
Для сложных приложений мы можем даже указать более одного обработчика, используя класс HandlerCollection
.
Предположим, мы реализовали два пользовательских обработчика. Первый выполняет только операции регистрации, а второй создает и отправляет фактический ответ пользователю. Мы хотим обрабатывать каждый входящий запрос обоими в этом порядке.
Вот как это сделать:
Handler handlers = new HandlerCollection();
handlers.addHandler(loggingRequestHandler);
handlers.addHandler(customRequestHandler);
server.setHandler(handlers);
5. Соединители
Следующее, что мы хотим сделать, это настроить, какие адреса и порты сервер будет прослушивать, и добавить тайм-аут простоя.
Класс Server
объявляет два удобных конструктора, которые можно использовать для привязки к определенному порту или адресу.
Хотя это может быть нормально при работе с небольшими приложениями, этого будет недостаточно, если мы хотим открыть несколько соединений на разных сокетах.
В этой ситуации Jetty предоставляет интерфейс Connector и, в частности, класс
ServerConnector
, который позволяет определять различные параметры конфигурации подключения:
ServerConnector connector = new ServerConnector(server);
connector.setPort(80);
connector.setHost("169.20.45.12");
connector.setIdleTimeout(30000);
server.addConnector(connector);
В этой конфигурации сервер будет прослушивать 169.20.45.12:80. Каждое соединение, установленное по этому адресу, будет иметь тайм-аут 30 секунд.
Если нам нужно настроить другие сокеты, мы можем добавить другие разъемы.
6. Заключение
В этом кратком руководстве мы сосредоточились на том, как настроить встроенный сервер с помощью Jetty. Мы также увидели, как выполнять дальнейшие настройки с помощью Handlers
и Connectors
.
Как всегда, весь используемый здесь код можно найти на GitHub .