Question on Stackoverflow: http://stackoverflow.com/questions/32666086/websockets-using-spring-sockjs-stomp-on-magnolia-cms
I'm trying to implement some Websocket functionality for my web app running on Tomcat 7. I'm using the following tech: (server) Spring Websocket + Spring Messaging (client) SockJS + Stomp.js I'm following this guide (roughly): http://g00glen00b.be/spring-angular-sockjs/ My configuration is similar to the guide, but I'll add some snippets of my code here: Client: [code] s.socket = new SockJS('http://localhost:8181/.cckiosk/socket/test'); //s.socket = new SockJS('http://localhost:8181/.cckiosk/socket/test', {}, { transports: ['xhr-polling'] }); s.client = Stomp.over(s.socket); s.client.connect({}, onConnect); s.client.onclose = onDisconnect;[/code] Server: [code]@Configuration @ComponentScan @EnableWebSocketMessageBroker public class ModuleWebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry broker) { //Prefix for messages FROM server TO client broker.enableSimpleBroker("/client"); //Prefix for messages FROM client TO server broker.setApplicationDestinationPrefixes("/server"); } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/socket/test").setAllowedOrigins("*").withSockJS(); } }[/code] Controller: [code]@MessageMapping("/socket/test") @SendTo("/client/message") public GenericMessage doSample(GenericMessage msg) { log.info("doSample: " + JsonUtil.jsonify(msg)); return new GenericMessage(msg.getId(), msg.getMessage(), new Date()); }[/code] I have everything set up in a vanilla Spring app, and everything works great. Here is my ModuleLifecycle class on Magnolia: [code]public class WebsocketsModule implements ModuleLifecycle { private String urlMappings = "/.ws/*"; private DispatcherServlet dispatcherServlet; @Override public void start(ModuleLifecycleContext moduleLifecycleContext) { if (moduleLifecycleContext.getPhase() == ModuleLifecycleContext.PHASE_SYSTEM_STARTUP) { //Retrieve serlvet context. ServletContext servletContext = getServletContext(); //Initialize root context. //TODO Somehow this root context doesn't work for @Transactional and I'm forced to add all the config classes to the dispatcherServlet. // AnnotationConfigWebApplicationContext rootCtx = new AnnotationConfigWebApplicationContext(); // rootCtx.register(ModuleAppConfig.class, ModuleWebSocketConfig.class); // contextLoader = new ContextLoader(rootCtx); // contextLoader.initWebApplicationContext(servletContext); //Initialize dispatcher servlet. AnnotationConfigWebApplicationContext webCtx = new AnnotationConfigWebApplicationContext(); webCtx.register(ModuleAppConfig.class, ModuleWebSocketConfig.class, ModuleWebConfig.class); dispatcherServlet = new DispatcherServlet(webCtx); final ServletRegistration.Dynamic dispatcherRegistration = servletContext.addServlet("api-dispatcher", dispatcherServlet); dispatcherRegistration.setLoadOnStartup(1); //For web sockets dispatcherRegistration.setInitParameter("dispatchOptionsRequest", "true"); dispatcherRegistration.setAsyncSupported(true); final String[] urlMappingArray = urlMappings.split(","); dispatcherRegistration.addMapping(urlMappingArray); //For websockets for (FilterRegistration registration : servletContext.getFilterRegistrations().values()) { registration.setInitParameter("dispatchOptionsRequest", "true"); ((FilterRegistration.Dynamic)registration).setAsyncSupported(true); } //For websockets for (ServletRegistration servletRegistration : servletContext.getServletRegistrations().values()) { servletRegistration.setInitParameter("dispatchOptionsRequest", "true"); ((ServletRegistration.Dynamic)servletRegistration).setAsyncSupported(true); } } }[/code] However, when I port the same code over to a Magnolia module, the code stops working. There is a client-side error about the websocket connection failing. I enabled debug mode and found out that my connection was being reset. Here it is: [code]2015-09-19 16:28:43,412 DEBUG eb.socket.handler.LoggingWebSocketHandlerDecorator: New WebSocketServerSockJsSession[id=tde1syjd] 2015-09-19 16:28:43,413 DEBUG eb.socket.handler.LoggingWebSocketHandlerDecorator: Transport error in WebSocketServerSockJsSession[id=tde1syjd] java.net.SocketException: Connection reset at java.net.SocketInputStream.read(SocketInputStream.java:196) at java.net.SocketInputStream.read(SocketInputStream.java:122) at org.apache.coyote.http11.upgrade.BioServletInputStream.doRead(BioServletInputStream.java:37) at org.apache.coyote.http11.upgrade.AbstractServletInputStream.read(AbstractServletInputStream.java:129) at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:47) at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler$WsReadListener.onDataAvailable(WsHttpUpgradeHandler.java:203) at org.apache.coyote.http11.upgrade.AbstractServletInputStream.onDataAvailable(AbstractServletInputStream.java:203) at org.apache.coyote.http11.upgrade.AbstractProcessor.upgradeDispatch(AbstractProcessor.java:93) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:623) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745)[/code] The error is either a "Connection Reset" or a "Broken Pipe" error. Any idea what could be in Magnolia that's causing a long-lived Websocket session to have its connection closed? -- Context is everything: http://forum.magnolia-cms.com/forum/thread.html?threadId=8f391440-2f76-4680-aea3-42fe3156618d ---------------------------------------------------------------- For list details, see http://www.magnolia-cms.com/community/mailing-lists.html Alternatively, use our forums: http://forum.magnolia-cms.com/ To unsubscribe, E-mail to: <user-list-unsubscr...@magnolia-cms.com> ----------------------------------------------------------------