gpt4 book ai didi

java - 在 jetty 中部署 webapps 和 websockets

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:40:42 26 4
gpt4 key购买 nike

我已将 Jetty 嵌入到我的应用程序中。我有一个 web 应用程序,我在 Jetty 中成功部署了该 web 应用程序。现在我对 Websockets 有了另一个要求。我跟着这个link用于在 Jetty 中部署 websockets。将 Websockets 部署到我的服务器后,第一个 webapp 无法正常工作(主页未打开)。这是图片

enter image description here

这是代码(这里很难粘贴整个代码。所以我粘贴了 webapp 和 websocket 部署代码)。

网络应用程序部署:

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] at com.tdg.daemon.server.RiseServer.getWebappHandlers(RiseServer.java:122) ~[classes/:na] at com.tdg.daemon.server.RiseServer.addWebApps(RiseServer.java:77) ~[classes/:na] at com.tdg.daemon.server.RiseServer.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 at org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer.configureContext(WebSocketServerContainerInitializer.java:65) at com.tdg.daemon.server.RiseServer.getWebappHandlers(RiseServer.java:122) at com.tdg.daemon.server.RiseServer.addWebApps(RiseServer.java:77) at com.tdg.daemon.server.RiseServer.init(RiseServer.java:59) at com.tdg.daemon.server.RiseServerConfiguration.build(RiseServerConfiguration.java:475) at com.tdg.daemon.server.launcher.DefaultTdgServerLauncher.start(DefaultTdgServerLauncher.java:78) at 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 started on port 80 and 443.

最佳答案

WebSocketServerContainerInitializer.configureContext() 需要有关它将在其下运行的Server 的知识。

有两种方法可以完成此操作,在调用 WebSocketServerContainerInitializer.configureContext()

之前选择其中一种方法
  1. 在尝试配置上下文之前,通过 Server.setHandler(Handler) 调用将 ServletContextHandler 添加到 Server 实例。 (ServletContextHandler 可以是更大的 Handler 树的一部分,这会起作用)。仅调用 Server.setHandler(Handler) 的行为将为您声明的所有 Handler 实例填充 Server 引用。 (这是推荐的方法)
  2. 手动调用 ServletContextHandler.setServer(server) - 但注意不要换出/更改您稍后在 Server.setHandler(Handler) 中使用的 Server 实例) 调用。此外,一旦执行此操作,就无法更改服务器中的内容,例如线程池、执行器、缓冲池、调度程序等。(这是一种不受欢迎但实用的方法)<

关于java - 在 jetty 中部署 webapps 和 websockets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34036393/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com