Объедините Джерси с Тайрусом
У меня есть приложение Jersey JAX-RS, которое работает на экземпляре Grizzly:
public class Application {
public static final String BASE_URI = "http://127.0.0.1:8080/rest";
public static void main(String[] args) throws IOException {
ResourceConfig rc = new ResourceConfig().packages("my.package.rest");
HttpServer server = GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc);
System.out.println("Server started, press any key to stop.");
System.in.read();
server.shutdownNow();
}
}
внутри my.package.rest
Есть аннотированные ресурсы JAX-RS. Я хотел бы добавить аннотированный websocket (@ServerEndpoint
, @OnOpen
, @OnMessage
и т. д.) ресурсов, использующих Tyrus на одном и том же экземпляре сервера (например, в " http://127.0.0.1:8080/websocket"), но вся документация, которую мне удалось найти, показывает, как запустить автономный сервер веб-сокетов с помощью Tyrus + a Гризли контейнер, не в сочетании с Джерси. Я ищу что-то вроде:
server.getServerConfiguration().addHttpHandler(new SomeTyrusHttpHandler("/websocket"));
но я не могу найти ничего похожего на SomeTyrusHttpHandler
, Как я могу объединить Джерси и Тайрус на одном сервере Grizzly?
1 ответ
Хороший вопрос, но в настоящее время нет хорошего ответа на этот вопрос. Вы все еще можете сделать это, но это потребует глубокого погружения во внутренности Гризли; Tyrus регистрируется надстройкой (см. WebSocketAddOn), и его можно комбинировать с способом регистрации в Джерси в этом контейнере.
Пожалуйста, имейте в виду, что объединение этих двух платформ не является тривиальной задачей - запуск их в одном контейнере - это первый шаг, но есть и другие вещи, о которых нужно позаботиться, такие как "поставщик экземпляров", настройка жизненного цикла и т. Д. Я полагаю, что эта тема выходит за рамки одного SO-ответа - об этом можно ожидать от меня или какого-либо другого члена команды Tyrus/Jersey. (Я опубликую это здесь, как только это будет сделано).
В любом случае, я бы порекомендовал придерживаться более консервативного подхода и использовать какой-нибудь легкий контейнер, который поддерживает Servlet 3.1; это должно потребовать гораздо меньше усилий на вашей стороне, и вы будете иметь стандартный рабочий цикл / жизненный цикл сервлета.