2015-12-02 75 views
1

我已將Jetty嵌入到我的應用程序中。我有一個Web應用程序,我成功地在Jetty中部署了該Web應用程序。現在我對Websockets有了另一個要求。我遵循這個link在Jetty中部署websockets。將Websocket部署到我的服務器後,第一個Web應用程序無法正常工作(主頁未打開)。這裏是圖像在jetty中部署webapps和websockets

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代碼的實際Web應用是不工作的,但websocket代碼正在工作。

那麼如何在一個Jetty服務器中部署webapp和websocket?

更新時間:

我想包括的WebSockets在當前Web應用本身,而是我得到了以下異常。

顯示java.lang.NullPointerException:空 在org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer.configureContext(WebSocketServerContainerInitializer.java:65)〜[使用javax-的WebSocket - 服務器 - 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.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

你的webapp的contextPath是什麼?什麼是您的服務器處理程序樹/訂單?爲什麼你不能將Websocket作爲Web應用程序本身的一部分? –

+0

@JoakimErdfelt我的web應用程序的上下文路徑是/ tdg。我試圖將websocket包含在同一個webapp中,但我得到以下異常(請檢查更新的異常,因爲異常太長而無法粘貼)。 – Amar

回答

2

WebSocketServerContainerInitializer.configureContext()需要知道它將運行的Server

有2種方式來做到這一點,選擇這兩種方法在打電話前WebSocketServerContainerInitializer.configureContext()

  1. 通過其Server.setHandler(Handler)呼叫添加ServletContextHandlerServer比如你嘗試配置上下文之前。 (ServletContextHandler可以是更大的Handler樹的一部分,這會起作用)。僅僅調用Server.setHandler(Handler)的行爲將填充您聲明的所有Handler實例的Server引用。 (這是推薦的方法)
  2. 手動調用ServletContextHandler.setServer(server) - 但要小心,不要換出/改變你Server.setHandler(Handler)電話後使用Server實例。另外,一旦你這樣做,你不能改變事物的服務器中,如線程池,執行人,緩衝池,調度程序等(這是不可取的,但功能,方法)
+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。