2015-12-02 5 views
1

У меня встроенный Jetty в мое приложение. У меня есть один webapp, и я успешно развернул этот webapp в Jetty. Теперь я получил еще одно требование в Websockets. Я последовал за этим link для развертывания websockets в Jetty. После развертывания Websockets на моем сервере первый webapp не работает (домашняя страница не открывается). Вот образРазвертывание webapps и websockets in jetty

enter image description here

Вот код (Его очень трудно вставить весь код здесь. Так что я вставив WebAPP и развертывания WebSocket код).

Webapp Развертывание:

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); 

WebSocket Развертывание:

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); 
    } 
} 

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

Итак, как развернуть webapp и websocket на одном сервере Jetty?

Обновлено:

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

java.lang.NullPointerException: нуль в org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer.configureContext (WebSocketServerContainerInitializer.java:65) ~ [javax-WebSocket-сервера осущ-9,3 .6.v20151106.jar: 9.3.6.v20151106] at com.tdg.daemon.server.RiseServer.getWebappHandlers (RiseServer.java:122) ~ [classes /: na] на com.tdg.daemon.server. RiseServer.addWebApps (RiseServer.java:77) ~ [classes /: na] at com.tdg.daemon.server.RisServer.init (RiseServer.java:59) ~ [classes /: na] at com.tdg. daemon.server.RiseServerConfiguration.build (RiseServerConfiguration.java:475) ~ [classes /: na] at com.tdg.daemon .server.launcher.DefaultTdgServerLauncher.start (DefaultTdgServerLauncher.java:78) [classes /: na] at 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.DefaultTdgServerLaunc her.start (DefaultTdgServerLauncher.java:78) at com.tdg.daemon.server.launcher.DefaultTdgServerLauncher.main (DefaultTdgServerLauncher.java:140) [] 12/02/2015 17: 50: 06.985 [main -] INFO ctdslDefaultTdgServerLauncher - RiseServer запущен на портах 80 и 443.

+1

Каков ваш контекст webappapp? Каково ваше дерево/заказ обработчика сервера? Почему у вас нет веб-узлов, которые могут быть частью самого Webapp? –

+0

@JoakimErdfelt Контекст моего webapp - это/tdg. Я попытался включить websockets в тот же самый webapp, но я получаю следующее исключение (можете ли вы проверить обновленный, потому что исключение слишком длинное, чтобы вставить здесь). – Amar

ответ

2

WebSocketServerContainerInitializer.configureContext() необходимо знать про Server что он будет работать под управлением.

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

  1. Добавьте ServletContextHandler к экземпляру Server через его Server.setHandler(Handler) вызова, прежде чем пытаться настроить контекст. (ServletContextHandler может быть частью большого дерева Handler, и это будет работать). Простой акт вызова Server.setHandler(Handler) заполнит ссылку Server для всех заявленных вами Handler экземпляров. (Это рекомендуемый подход)
  2. вручную называют ServletContextHandler.setServer(server) - но будьте осторожны, чтобы не поменять/изменить Server экземпляр вы используете позже Server.setHandler(Handler) вызова. Кроме того, как только вы сделаете это, вы не можете изменить положение вещей на сервере, например, пул потоков, исполнителях, буферные пулы, планировщиков и т.д. (это нежелательно, но функциональный подход)
+0

Я думаю, что я уже реализовал то же самое, что вы упомянули в первом пункте. Не могли бы вы взглянуть на мой код websocket? Если я пропущу что-нибудь, пожалуйста, дайте мне знать. – Amar

0

@ Joakim Erdfelt, Его ошибка, и я согласен с вашим вторым моментом. Я сделал это: сначала я добавил обработчик webapp на сервер, а затем добавил обработчик websocket на сервер (исходя из вышеупомянутого примера).

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

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

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

Спасибо вам большое @Joakim Erdfelt.

Смежные вопросы