2014-03-01 81 views
0

我最近在tomcat 7.0.50上實現了websocket。我的tomcat運行在apache 2.4後面。 我使用了Strtus 2和Spring Security。它已停止工作。Websocket停止在tomcat上工作7.0.50

問題: Websocket連接已成功打開。 JavaScript事件處理程序成功啓動。 Apache日誌顯示,請求被接受爲具有101碼的協議升級請求 Tomcat的訪問日誌也顯示出相同的代碼101,用於協議升級

然而在服務器端的OnOpen消息不被燒製。 我試圖在javascript的事件處理程序中打開連接後立即發送消息。 JavaScript中沒有錯誤,但服務器端endPoint的onmessage永遠不會調用,就像onOpen從不調用。

下面是我所做的更改後,它已停止工作:

Windows Host file : I use dummy host name through Windows host file: 
127.0.0.1 phasingapp.com 
127.0.0.1 pricer.com 

wesocket網址:

old : ws://localhost:86/websocket/filuploadtrackerendpoint 
new : ws://phasingapp.com:86/websocket/filuploadtrackerendpoint 

添加的虛擬主機設置爲Apache:

<Location /jkweb/websocket/> 
    Require host phasingapp.com granted 
</Location>  

JkMount /jkweb/* localtomcat 
JkUnMount /jkweb/project/content/* localtomcat 
JkUnMount /jkweb/angle/content/* localtomcat 
JkUnMount /jkweb/index.jsp localtomcat 
JkUnMount /jkweb/ localtomcat 

ProxyRequests Off 
ProxyPreserveHost On 

ProxyPass /jkweb ! 
ProxyPass /jkweb/ ! 
ProxyPass /jkweb/websocket/ ws://localhost:8080/jkweb/websocket/ 
ProxyPassReverse /jkweb/websocket/ ws://localhost:8080/jkweb/websocket/ 
ProxyPass/http://localhost:8080/jkweb/ 
ProxyPassReverse/http://localhost:8080/jkweb/ 

的Struts 2:

changed url pattern for Struts 2 filter from ".action to " /* ". Also added exclusion filters 
to strtus2 for webscoket urls : 

<constant name="struts.action.excludePattern" value=".*websocket/.*"/> 

一切似乎工作正常,因爲我在Apache,Tomcat,Spring安全和Struts2日誌中的任何地方gettting沒有錯誤。

但是在服務器端沒有處理程序被調用?

早些時候我遇到了類似的問題,但這是因爲我已經將websocket-api jar放入了我的WEB-INF/lib中,這阻止了websocket連接被打開。現在打開連接,但之後沒有處理程序被調用,並經過一段時間的連接顯然是因爲我猜想timout。

這裏是我ServerEndPoint類:

 package com.jkweb.websocket; 

     import java.io.IOException; 
     import java.util.HashMap; 
     import java.util.List; 
     import java.util.Map; 

     import javax.websocket.EndpointConfig; 
     import javax.websocket.OnMessage; 
     import javax.websocket.OnOpen; 
     import javax.websocket.Session; 
     import javax.websocket.server.PathParam; 
     import javax.websocket.server.ServerEndpoint; 

     import org.slf4j.Logger; 
     import org.slf4j.LoggerFactory; 

     @ServerEndpoint(value="/websocket/fileuploadtracker") 
     public class FileUploadTrackerEndPoint{ 
     private static final Logger logger = LoggerFactory 
      .getLogger(FileUploadTrackerEndPoint.class); 
     private static HashMap<String,Session> socketConnectionMap = new HashMap<String,Session>(); 

    @OnOpen 
    public void open(Session session) { 
     Map<String,List<String>> paramMap = session.getRequestParameterMap(); 
     List<String> uniqueTockenValues = paramMap.get("uniqueTocken"); 
     if(uniqueTockenValues != null && uniqueTockenValues.size() > 0){ 
      socketConnectionMap.put(uniqueTockenValues.get(0),session); 
     } 
    } 
    @OnMessage 
    public void onMessage(Session session, String msg) { 
     try { 
      session.getBasicRemote().sendText(msg); 
     } catch (IOException e) { 
      logger.error(e.getMessage()); 
     } 
    } 

    public static void sendMessage(String uniqueTocken,String msg){ 
     try { 
      Session wsSession = socketConnectionMap.get(uniqueTocken); 
      wsSession.getBasicRemote().sendText(msg); 
     } catch (IOException e) { 
      logger.error(e.getMessage()); 
     } 
    } 
} 

和我的javascript代碼:

createFileUploadWebSocket : function(){ 
      var that = this; 
      var uniqueTocken = $("#uniqueTocken").val(), 
      wsurl = "ws://phasingapp.com:86/jkweb/websocket/fileuploadtracker?uniqueTocken="+uniqueTocken, 
      ws; 
      ws = new WebSocket(wsurl); 
      ws.onopen = function() 
      { 
       alert("opened..") //I get this aler sothis is called 
       ws.send("test");//however this has not effect ...no error but server end point is not called 
      }; 
      ws.onmessage = function (evt) 
      { 
       message = evt.data; 
       if(message == "Done."){ 
        alert("closing.."); 
        ws.close(); 
        $('#progressbar').progressbar('option','value',100); 
      } 
       var currentVal = $('#progressbar').progressbar('option','value'); 
       $('#progressbar').progressbar('option','value',currentVal <= 80 ?currentVal+1 : currentVal); 
      }; 
      ws.onclose = function(evt) 
      { 
       // websocket is closed. 
       alert("Connection is closed..."+evt.code + ":"+evt.reason); 
      }; 

      ws.onerror = function(evt){ 
       alert("Connection is closed..."+evt.code + ":"+evt.reason); 
      }; 

     }, 
+0

以下是日誌片段的初始日誌請求:127.0.0.1 - - [01/Mar/2014:14:20:12 +0530]「GET /jkweb/js/angle/addAngle.js?_=1393663610411 HTTP/1.1「200 4278 127.0.0.1 - - [01/Mar/2014:14:20:41 +0530]」GET /jkweb/angle/validateDuplicateAngleName.action?angleName=angle7 HTTP/1.1「200 - phasingapp。 com - - [01/Mar/2014:14:21:15 +0530]「GET/jkweb/websocket/fileuploadtracker?uniqueTocken = 9c9e740c-7171-4c33-bc92-e0a46cb2d2b5 HTTP/1.1「101 - 其他請求爲什麼它是127.0.0.1,對於websocket請求它是phasingapp.com? –

+0

將日誌段添加到問題中,以便更清楚地理解它。 –

回答

1
與其他所有我的WebSocket的問題,我找到了答案,我conffiguration(配置錯誤)本身

再次。

ProxyPass /jkweb ! 
ProxyPass /jkweb/ ! 
ProxyPass /jkweb/websocket/ ws://localhost:8080/jkweb/websocket/ 
ProxyPassReverse /jkweb/websocket/ ws://localhost:8080/jkweb/websocket/ 
ProxyPass/http://localhost:8080/jkweb/ 
ProxyPassReverse/http://localhost:8080/jkweb/ 

我改變的ProxyPass指令的順序如下圖所示:

ProxyPass /jkweb/websocket/ ws://localhost:8080/jkweb/websocket/ 
ProxyPassReverse /jkweb/websocket/ ws://localhost:8080/jkweb/websocket/ 
ProxyPass /jkweb ! 
ProxyPass /jkweb/ ! 
ProxyPass/http://localhost:8080/jkweb/ 
ProxyPassReverse/http://localhost:8080/jkweb/ 

對於WebSocket的ProxyPass指令之前把它造成每個請求開始jkweb /是導致它繞過代理。

相關問題