Объедините Джерси с Тайрусом

У меня есть приложение 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; это должно потребовать гораздо меньше усилий на вашей стороне, и вы будете иметь стандартный рабочий цикл / жизненный цикл сервлета.

Другие вопросы по тегам