我已将Jetty嵌入到我的应用程序中。我有一个webapp,我在Jetty中成功部署了该webapp。现在我对Websockets有了另一个要求。我按照这个link在Jetty中部署websockets。将Websockets部署到我的服务器后,第一个webapp无法正常工作(主页未打开)。这是图像
这是代码(很难在这里粘贴整个代码。所以我粘贴了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代码,那么实际的webapp不起作用,但websocket代码正在运行。
那么如何在一个Jetty服务器中部署webapp和websocket?
更新
我尝试将Websockets包含在当前的webapp中,但是我遇到了以下异常。
java.lang.NullPointerException:null at 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 at 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) [] 12/02/2015 17:50:06.985 [main - ] INFO c.t.d.s.l.DefaultTdgServerLauncher - RiseServer在端口80和443上启动。
答案 0 :(得分:3)
WebSocketServerContainerInitializer.configureContext()
需要了解它将在其下运行的Server
。
有两种方法可以实现此目的,在致电WebSocketServerContainerInitializer.configureContext()
ServletContextHandler
调用将Server
添加到Server.setHandler(Handler)
实例。 (ServletContextHandler
可以是更大的Handler
树的一部分,这将起作用)。仅调用Server.setHandler(Handler)
的行为将填充您已声明的所有Server
个实例的Handler
引用。 (这是推荐的方法) ServletContextHandler.setServer(server)
- 但请注意不要更换/更改稍后在Server
呼叫中使用的Server.setHandler(Handler)
实例。此外,一旦执行此操作,您就无法更改服务器中的内容,例如线程池,执行程序,缓冲池,调度程序等。(这是一种不受欢迎但功能正常的方法) 答案 1 :(得分:0)
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。