I tried debuggin tomcat sources. And compared the difference I am getting
between normal tomcat websocket examples and my code. Only difference i
could found was tomcat example uses Abstract Protocol class to fire the
register session event and mine uses AjpProcessor(because I am using tomcat
behind apache). but in AJpProcessor class it gets stuck and never calls
registersession for Websocket.

I know above information might be utterlyt useless but this waht i have
understood ..guys I need this to be resolved ASAP. it was working fine when
i was using localhost everywhere. since I changed it to dummy host it  has
stopped working


On Sat, Mar 1, 2014 at 2:31 PM, J Java <jforjava1...@gmail.com> wrote:

>
> 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 -
>
> Above is the relevant log section of apache : could it be the cause that
> websocket request is coming from phasingapp.com and others from 127.0.01
>
>
> On Sat, Mar 1, 2014 at 1:53 PM, J Java <jforjava1...@gmail.com> wrote:
>
>>  I had recently implemented websocket on tomcat 7.0.50. my tomcat runs
>> behind apache 2.4. I use Strtus 2 and Spring Security. It has stopped
>> working.
>>
>> Problem : Websocket connection is opened successfully. Javascript event
>> handler get fires successfully. Apache logs show that request was accepted
>> as an protocol upgrade request with 101 code Tomcat access logs also show
>> the same code 101 for protocol upgrade
>>
>> However on server side onOpen message is not fired. I tried sending the
>> message as soon as connection is opened in javascript's event handler..
>> There is no error in javascript but Server side endPoint's onmessage is
>> never called just like onOpen is never called.
>>
>> Here are the changes I made after which it has stopped working:
>>
>>  Windows Host file : I use dummy host name through Windows host file:
>> 127.0.0.1    phasingapp.com
>> 127.0.0.1    pricer.com
>>
>> URL of wesocket :
>>
>> old  :  ws://localhost:86/websocket/filuploadtrackerendpoint
>> new : ws://phasingapp.com:86/websocket/filuploadtrackerendpoint
>>
>> Added virtual host config for 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/.*"/>
>>
>> Everything seems to be working fine as i am gettting no error anywhere in
>> apache,tomcat,spring security and Struts2 logs.
>>
>> However on server side no handlers are called?
>>
>> Earlier I had faced similar problem but it was because I had put
>> websocket-api jar in my WEB-INF/lib which was preventing websocket
>> connection from getting opened. No connection is opened but no handler is
>> called after that and after some time connection is closed obviously
>> because of timout I suppose.
>>
>> Here is my ServerEndPoint class :
>>
>>       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());
>>         }
>>     }
>> }
>>
>> and my javascript code :
>>
>> 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 );
>>              };
>>
>>         },
>>
>> Thanks,
>>  Shailesh.
>>
>
>

Reply via email to