«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

Класс 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. Мы также увидели, как выполнять дальнейшие настройки с помощью обработчиков и соединителей.

Как всегда, весь используемый здесь код можно найти на GitHub.