Развертывание веб-приложений и веб-сокетов в причале

Я встроил Jetty в свое приложение. У меня есть одно веб-приложение, и я успешно развернул это веб-приложение в Jetty. Теперь у меня есть еще одно требование к веб-сокетам. Я следовал этому ссылка для развертывания веб-сокетов в Jetty. После развертывания веб-сокетов на моем сервере первое веб-приложение не работает (домашняя страница не открывается). Вот изображение

введите здесь описание изображения

Вот код (здесь очень сложно вставить весь код, поэтому я вставляю код развертывания веб-приложения и веб-сокета).

Развертывание веб-приложения:

List<Handler> handlersList = new ArrayList<Handler>();
WebAppContext webAppContext = new WebAppContext();
webAppContext.setResourceBase(webApp.appDir);
webAppContext.setDescriptor(webApp.appDir + "/WEB-INF/web.xml");
webAppContext.setContextPath(webApp.contextPath);
webAppContext.setParentLoaderPriority(true);
// webAppContext.setWar(webApp.appDir);
webAppContext.setVirtualHosts(webApp.hostName);
handlersList.add(webAppContext);
argNewServer.setHandler(handlersList);

Развертывание веб-сокета:

ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/echo");
argServer.setHandler(context);

// Initialize javax.websocket layer
ServerContainer wscontainer;
try {
    wscontainer = WebSocketServerContainerInitializer.configureContext(context);
    // Add WebSocket endpoint to javax.websocket layer
    wscontainer.addEndpoint(WebSocketServer.class);
} catch (ServletException | DeploymentException e) {
    throw new RuntimeException("Exception while adding websocket endpoint: ", e);
}

WebSocketServer.java:

package com.tdg.chat;

import java.io.IOException;

import javax.websocket.CloseReason;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

@ServerEndpoint(value = "/events/")
public class WebSocketServer {
    @OnOpen
    public void onWebSocketConnect(Session sess) {
        System.out.println("Socket Connected: " + sess);
    }

    @OnMessage
    public void onWebSocketText(Session argSession, String argMessage) throws IOException {
        System.out.println("Received TEXT message: " + argMessage);
        argSession.getBasicRemote().sendText("From Server: ");
    }

    @OnClose
    public void onWebSocketClose(CloseReason reason) {
        System.out.println("Socket Closed: " + reason);
    }

    @OnError
    public void onWebSocketError(Throwable cause) {
        cause.printStackTrace(System.err);
    }
}

Если я включу вышеупомянутый код веб-сокета, фактическое веб-приложение не работает, но код веб-сокета работает.

Итак, как развернуть веб-приложение и веб-сокет на одном сервере Jetty?

Обновлено:

Я попытался включить веб-сокеты в текущее веб-приложение, но получаю следующее исключение.

java.lang.NullPointerException: null в org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer.configureContext(WebSocketServerContainerInitializer.java:65) ~[javax-websocket-server-impl-9.3.6.v20151106.jar: 9.3.6.v20151106] на com.tdg.daemon.server.RiseServer.getWebappHandlers(RiseServer.java:122) ~[classes/:na] на com.tdg.daemon.server.RiseServer.addWebApps(RiseServer.java:77) ) ~[classes/:na] в com.tdg.daemon.server.RiseServer.init(RiseServer.java:59) ~[classes/:na] в com.tdg.daemon.server.RiseServerConfiguration.build(RiseServerConfiguration.java :475) ~[classes/:na] в com.tdg.daemon.server.launcher.DefaultTdgServerLauncher.start(DefaultTdgServerLauncher.java:78) [classes/:na] в com.tdg.daemon.server.launcher.DefaultTdgServerLauncher. main(DefaultTdgServerLauncher.java:140) [classes/:na] java.lang.NullPointerException в org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer .configureContext(WebSocketServerContainerInitializer.java:65) в com.tdg.daemon.server.RiseServer.getWebappHandlers(RiseServer.java:122) в com.tdg.daemon.server.RiseServer.addWebApps(RiseServer.java:77) в com. tdg.daemon.server.RiseServer.init(RiseServer.java:59) в com.tdg.daemon.server.RiseServerConfiguration.build(RiseServerConfiguration.java:475) в com.tdg.daemon.server.launcher.DefaultTdgServerLauncher.start( DefaultTdgServerLauncher.java:78) в com.tdg.daemon.server.launcher.DefaultTdgServerLauncher.main(DefaultTdgServerLauncher.java:140) [] 02/12/2015 17:50:06.985 [main - ] INFO ctdslDefaultTdgServerLauncher — RiseServer запущен порт 80 и 443.


person Amar    schedule 02.12.2015    source источник
comment
Какой у вашего веб-приложения contextPath? Какое у вас дерево/порядок обработчика сервера? Почему веб-сокеты не могут быть частью самого веб-приложения?   -  person Joakim Erdfelt    schedule 02.12.2015
comment
@JoakimErdfelt Контекстный путь моего веб-приложения — /tdg. Я попытался включить веб-сокеты в одно и то же веб-приложение, но получаю следующее исключение (не могли бы вы проверить обновленное, потому что исключение слишком длинное, чтобы вставить его сюда).   -  person Amar    schedule 02.12.2015


Ответы (2)


WebSocketServerContainerInitializer.configureContext() требует знаний о Server, под которым он будет работать.

Есть два способа сделать это, выберите любой из них, прежде чем вызывать WebSocketServerContainerInitializer.configureContext().

  1. Добавьте ServletContextHandler к экземпляру Server через его вызов Server.setHandler(Handler), прежде чем пытаться настроить контекст. (ServletContextHandler может быть частью большего дерева Handler, и это будет работать). Простое действие вызова Server.setHandler(Handler) заполнит ссылку Server для всех Handler экземпляров, которые вы объявили. (Это рекомендуемый подход)
  2. Вручную вызовите ServletContextHandler.setServer(server), но будьте осторожны, чтобы не заменить/не изменить экземпляр Server, который вы используете позже в вызове Server.setHandler(Handler). Кроме того, как только вы это сделаете, вы не сможете изменить что-то на сервере, например, пул потоков, исполнителей, пулы буферов, планировщики и т. д. (Это нежелательный, но функциональный подход)
person Joakim Erdfelt    schedule 02.12.2015
comment
Я думаю, что я уже реализовал то же самое, что вы упомянули в первом пункте. Не могли бы вы взглянуть на мой код веб-сокета.? Если я что-то пропущу, пожалуйста, дайте мне знать.? - person Amar; 03.12.2015

@Joakim Erdfelt, это моя ошибка, и я согласен с вашим вторым пунктом. Что я сделал, так это то, что сначала я добавил свой обработчик веб-приложения на сервер, а затем добавил обработчик веб-сокета на сервер (на основе вышеупомянутого примера).

argNewServer.setHandler(webAppContext);
argNewServer.setHandler(context);

Как вы однажды упомянули во втором пункте, если мы установим обработчики на сервер, мы не сможем изменить вещи на сервере. Это правда, я изменил свой код, как будто я добавил все свои обработчики одним выстрелом. Затем мое веб-приложение начинает работать, и мой веб-сокет также работает. Вот измененный код

List<Handler> handlersList = new ArrayList<Handler>();
handlersList.add(webAppContext);
handlersList.add(context);
argNewServer.setHandler(handlersList);

Большое спасибо @Joakim Erdfelt.

person Amar    schedule 03.12.2015