JSR-356 javax websockets в Jetty (встроенный и нет) - PullRequest
0 голосов
/ 28 ноября 2018

Учитывая, что:

Я бы хотел развернуть веб-приложение, упакованное как WAR, содержащее web.xml, на сервере Jetty.

В этом приложении я бы хотел бытьвозможность настроить указанные конечные точки javax websocket в JSR-356.Я предпочитаю, чтобы эти конечные точки предоставлялись через ServerEndpointConfig, , а не при сканировании аннотаций.

Существует множество ресурсов, иллюстрирующих это со встроенной Jetty, использующей уже известный WebSocketServerContainerInitializer.configureContext(context); API.Я не могу этого сделать, очевидно.

Есть и другие, которые прыгают прямо на ServletContextListener и получают ServerContainer через знаменитого context.getAttribute("javax.websocket.server.ServerContainer").До сих пор я получаю NULL через этот API, так что, очевидно, контейнер не добавляется.

Вопрос:

Что это за бит конфигурации, который отсутствует?Можно ли это сделать, желательно, через web.xml?Если речь идет о конфигурационных файлах, таких как jetty.xml или jetty.ini - пример был бы хорош, опять же, предпочтительно для синтаксиса xml.

Обновление:

Согласно ответу ниже (принятыйодин) и, как я на самом деле пытался описать здесь - известный способ настройки - абсолютно , работающий просто отлично.Говоря «известный», я имею в виду либо добавление --module=websocket к какому-либо файлу *.ini для не встроенной Jetty, либо обращение к WebSocketServerContainerInitializer.configureContext для встроенного.

Итак, перефразируем вопрос: есть ли опыт /кто-нибудь знает, как включить модуль websocket с помощью чисто XML конфигурации?

1 Ответ

0 голосов
/ 28 ноября 2018

Если вы используете рекомендуемые процессы установки ${jetty.base} и ${jetty.home} для автономной Jetty , вам нужно перейти в каталог экземпляра ${jetty.base} и включить модуль websocket.

$ cd /path/to/mybase
$ java -jar /opt/jetty/jetty-home-9.4.14.v20181114/start.jar --add-to-start=websocket
$ grep "websocket" start.ini
--module=websocket

Теперь у вас включен веб-сокет для этого экземпляра ${jetty.base}.

Если вы хотите, чтобы Jetty обнаружила конечные точки вашего сервера WebSocket с помощью байт-кода, сканирующего развернутые веб-приложения на наличие аннотаций, то вам также понадобится annotationsmodule.

$ cd /path/to/mybase
$ java -jar /opt/jetty/jetty-home-9.4.14.v20181114/start.jar --add-to-start=annotations
$ grep "annotations" start.ini
--module=annotations

После этого вы можете выполнить одно (или несколько) из следующих действий, чтобы развернуть конечные точки сервера websocket с вашим веб-приложением.

Почему это работает в автономной Jetty?Что делает автономная Jetty, чтобы сделать это возможным?

Происходит следующее:

  • Модуль websocket добавляет lib/websocket/*.jar к пути к классу сервера
  • Модуль websocket зависит от модулей client и annotations
  • Модуль client добавляет lib/jetty-client-<jetty.version>.jar к пути к классу сервера
  • Модуль annotations добавляет lib/jetty-annotations-<jetty.version>.jar и lib/annotations/*.jar к пути к классу сервера
  • Модуль annotations зависит от модуля plus
  • .Модуль annotations выбирает etc/jetty-annotations.xml для выполнения при запуске
  • Модуль annotations добавляет модули JPMS по имени org.objectweb.asm
  • plusмодуль добавляет lib/jetty-plus-<jetty.version>.jar к пути к классу сервера
  • Модуль plus выбирает etc/jetty-plus.xml для выполнения при запуске
  • Модуль plus зависит отмодули server, security, jndi, webapp и transactions

(я пропущу остальные модули, выбранные таким образом)

Короче говоря, просто добавив websocket модуль, вы получаете следующие записи classpath сервера

lib/websocket/*.jar
lib/jetty-client-<jetty.version>.jar
lib/jetty-annotations-<jetty.version>.jar
lib/annotations/*.jar
lib/jetty-plus-<jetty.version>.jar

и следующие XML-файлы

lib/jetty-annotations.xml
lib/jetty-plus.xml

Оба этих XML-файла просто изменяют список по умолчанию Configuration на стороне сервераделая поведение Configuration, которое они вводят, доступным для всех развернутых WebApps.

В качестве альтернативы можно установить Configuration на WebAppContext (до его запуска) для специфического поведения веб-приложения.

Пример:

WebAppContext context = new WebAppContext();
context.setContextPath("/");
context.setBaseResource(Resource.newResource(rootResourceUrl));

context.setConfigurations(new Configuration[] {
            new AnnotationConfiguration(),
            new WebXmlConfiguration(),
            new WebInfConfiguration(),
            new PlusConfiguration(), 
            new MetaInfConfiguration(),
            new FragmentConfiguration(), 
            new EnvConfiguration()});    

handlerList.addHandler(context);

Примечание: для javax.websocket вы должны использовать WebAppContext, поскольку поведения, определенные для его инициализации, требуют полногоВеб-приложение для работы.Хотя вы можете использовать ServletContextHandler с javax.websocket конечными точками, этот стиль на 100% определяется вручную, инициализируется и объявляется без функций автоматического сканирования байт-кода / аннотаций, на которые опирается JSR-356.

Вы также можете увидеть все это из командной строки.

Показать активную ${jetty.base} конфигурацию, каковы значения свойств XML, каков путь к классу сервера и какой XML будет выполняться (ив каком порядке !!)

$ cd /path/to/mybase
$ java -jar /opt/jetty/jetty-home-9.4.14.v20181114/start.jar --list-config

Показать список модулей и как они связаны (а также какие из них выбраны в вашей конфигурации ${jetty.base})

$ cd /path/to/mybase
$ java -jar /opt/jetty/jetty-home-9.4.14.v20181114/start.jar --list-modules
...