Джерси 2.28, WebSockets, Tomcat и глобальное приложение InMemoryWebsocketRegistry - PullRequest
0 голосов
/ 23 мая 2019

Я создаю пример веб-приложения в реальном времени для студентов университетов с использованием Jersey и WebSockets. Для начала: я пришел из Perl (Mojolicious) и C # (ASP.net Core). Я не являюсь носителем языка Java. ;)

И я осознаю, что для чистого решения мне понадобится какой-то более мощный механизм IPC (например, Pub-Sub через Redis, RabbitMQ и т. Д.). Но так как это для целей обучения, я хотел бы пойти с простым в процессе решения.

Основная идея: для каждого запроса WebSocket, который принимает приложение, я вставляю Session в мой InMemoryWebsocketRegistry. Это InMemoryWebsocketRegistry должно иметь время жизни "уровня приложения". Когда пользователи публикуют новые материалы через REST-API, я хотел бы получить InMemoryWebsocketRegistry -Instance через @Inject из системы внедрения зависимостей, а затем вызвать что-то вроде InMemoryWebsocketRegistry.broadcastMessage(String), чтобы уведомить всех подключенных клиентов WebSocket. По крайней мере, так я бы выполнил свою работу в других рамках. ;)

Как это выглядит в настоящее время, Джерси (или включенной системе внедрения зависимостей HK2) не хватает возможности @Inject вводить данные в @ServerEndpoint (что, насколько я понял, требуется для функциональности WebSocket). Поэтому у меня возникают проблемы с тем, как использовать идентичный объект для управления сеансом WebSocket в WebSocket-Handler и REST-ресурсе.

Я уже пробовал синглтон-прицел для DI. Но для ServerEndpoint я всегда получаю null -объект, а в обычных REST-ресурсах я получаю ожидаемый объект. Я читал об Immediate Scope, но добавление InMemoryWebsocketRegistry таким образом к HK2 просто дает мне исключение, говорящее «Не удалось найти активный контекст для org.glassfish.hk2.api.Immediate».

Так что теперь у меня нет идей. У кого-нибудь есть идеи, как это решить? Или это просто невозможно?

Полный пример приложения также доступен на GitHub .

...