Веб-сокеты с использованием Spring + SockJS + STOMP на Magnolia CMS

Я пытаюсь реализовать некоторые функции Websocket для своего веб-приложения, работающего на Tomcat 7. Я использую следующую технологию:

  • (сервер) Spring Websocket + Spring Messaging
  • (клиент) SockJS + Stomp.js

Я следую этому руководству (примерно): http://g00glen00b.be/spring-angular-sockjs/

Моя конфигурация аналогична руководству, но я добавлю сюда несколько фрагментов своего кода:

Клиент:

    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;

Сервер:

@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();
    }
}

Контроллер:

@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());
}

У меня все настроено в приложении vanilla Spring, и все отлично работает.

Однако, когда я переношу тот же код в модуль Magnolia, код перестает работать, и я вижу следующие ошибки:

Ошибка на стороне клиента:

Ошибка на стороне клиента

Ошибка на стороне сервера:

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)

На самом деле это либо сброс соединения, либо сломанная труба.

Изменение транспортного протокола на не-вебсокет (например, xhr-polling) также не помогает.

Есть идеи, что может быть в Magnolia, из-за чего долгоживущий сеанс Websocket закрывается?


person Jensen Ching    schedule 19.09.2015    source источник


Ответы (2)


Решение заключалось в том, чтобы просто полностью обойти цепочку фильтров Magnolia.

Мне просто нужно было создать глобальный объект обхода в admincentral Magnolia: Конфигурация > сервер/фильтры/обходы

class: info.magnolia.StartsWithURIVoter
pattern: /socket

И соединение больше не сбрасывается и не прерывается.

person Jensen Ching    schedule 22.09.2015

В Mangolia 5 это «info.magnolia.voting.voters.URIStartsWithVoter» вместо «info.magnolia.StartsWithURIVoter».

person EagleT    schedule 28.08.2017