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>
----------------------------------------------------------------

Reply via email to