3

アプリケーションに Jetty を組み込みました。私は 1 つの webapp を持っており、その webapp を Jetty に正常にデプロイしました。ここで、Websockets に関する別の要件が発生しました。このリンクに従って、Jetty に WebSocket をデプロイしました。Websockets をサーバーにデプロイした後、最初の webapp が機能しません (ホームページが開きません)。画像はこちら

ここに画像の説明を入力

コードは次のとおりです (コード全体をここに貼り付けるのは非常に難しいため、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 コードは機能しています。

では、1 つの Jetty サーバーに webapp と websocket をデプロイする方法は?

更新しました:

現在の webapp 自体に Websockets を含めようとしましたが、次の例外が発生しています。

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] 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] org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer.configureContext(WebSocketServerContainerInitializer.java:65) での java.lang.NullPointerException 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) 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 ctdslDefaultTdgServerLauncher - RiseServer がポート 80 および 443 で開始されました。

4

2 に答える 2

3

には、それが実行されるWebSocketServerContainerInitializer.configureContext()に関する知識が必要です。Server

これを実現するには 2 つの方法があります。電話をかける前にいずれかの方法を選択してくださいWebSocketServerContainerInitializer.configureContext()

  1. コンテキストを構成する前に、その呼び出しを介しServletContextHandlerServerインスタンスに を追加してください。Server.setHandler(Handler)(より大きなツリーServletContextHandlerの一部にすることができ、これは機能します)。Handler呼び出すだけで、宣言し たすべてのインスタンスServer.setHandler(Handler)の参照が設定されます。(これは推奨されるアプローチです)ServerHandler
  2. 手動で呼び出します- ただし、後で使用するインスタンスをServletContextHandler.setServer(server)交換/変更しないように注意してください。また、一度これを行うと、スレッド プール、エグゼキューター、バッファー プール、スケジューラーなど、サーバー内のものを変更することはできません(これは望ましくありませんが、機能的なアプローチです)。ServerServer.setHandler(Handler)
于 2015-12-02T14:17:17.767 に答える