ConnectionLostException с использованием Spring Boot с Tomcat Websocket

У меня есть клиентское приложение Java Stomp Websocket, использующее Spring Boot 1.3.0-BUILD-SNAPSHOT. Вот мой pom.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.0.BUILD-SNAPSHOT</version>
    <relativePath />
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-websocket</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
</dependencies>

Мой StompSessionHandlerAdapter подписывается на раздел таймера, который каждую секунду получает сообщение, которое отлично работает. По другой теме я получаю сообщения каждые несколько минут. Когда приходит сообщение по этой теме, я получаю следующее исключение в методе StompSessionHandlerAdapter handleTransportError.

org.springframework.messaging.simp.stomp.ConnectionLostException: Connection closed
at org.springframework.messaging.simp.stomp.DefaultStompSession.afterConnectionClosed(DefaultStompSession.java:458)
at org.springframework.web.socket.messaging.WebSocketStompClient$WebSocketTcpConnectionHandlerAdapter.afterConnectionClosed(WebSocketStompClient.java:356)
at org.springframework.web.socket.sockjs.client.AbstractClientSockJsSession.afterTransportClosed(AbstractClientSockJsSession.java:321)
at org.springframework.web.socket.sockjs.client.WebSocketTransport$ClientSockJsWebSocketHandler.afterConnectionClosed(WebSocketTransport.java:172)
at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter.onClose(StandardWebSocketHandlerAdapter.java:143)
at org.apache.tomcat.websocket.WsSession.fireEndpointOnClose(WsSession.java:527)
at org.apache.tomcat.websocket.WsSession.doClose(WsSession.java:479)
at org.apache.tomcat.websocket.WsSession.close(WsSession.java:445)
at org.apache.tomcat.websocket.WsFrameClient.close(WsFrameClient.java:94)
at org.apache.tomcat.websocket.WsFrameClient.access$100(WsFrameClient.java:31)
at org.apache.tomcat.websocket.WsFrameClient$WsFrameClientCompletionHandler.completed(WsFrameClient.java:134)
at org.apache.tomcat.websocket.WsFrameClient$WsFrameClientCompletionHandler.completed(WsFrameClient.java:108)
at sun.nio.ch.Invoker.invokeUnchecked(Invoker.java:126)
at sun.nio.ch.Invoker$2.run(Invoker.java:218)
at sun.nio.ch.AsynchronousChannelGroupImpl$1.run(AsynchronousChannelGroupImpl.java:112)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

Вот код

public class SocketSessionHandler extends StompSessionHandlerAdapter {

private StompSession stompSession;


@Override
public void afterConnected(StompSession stompSession, StompHeaders connectedHeaders) {

    this.stompSession = stompSession;

    stompSession.setAutoReceipt(true);
    stompSession.subscribe("/topic/timer", new StompFrameHandler() {

        @Override
        public Type getPayloadType(StompHeaders headers) {
            return String.class;
        }

        @Override
        public void handleFrame(StompHeaders headers, Object payload) {
            System.out.println((payload.toString());
        }
    });
    stompSession.subscribe("/topic/scores", new StompFrameHandler() {

        @Override
        public Type getPayloadType(StompHeaders headers) {
            return ScoresPublish.class;
        }

        @Override
        public void handleFrame(StompHeaders headers, Object payload) {
            ScoresPublish pub = (ScoresPublish)payload;
            System.out.println(pub.getScore());
        }
    });

}

@Override
public void handleException(StompSession session, StompCommand command, StompHeaders headers,
        byte[] payload, Throwable exception) {
        exception.printStackTrace();
}

@Override
public void handleTransportError(StompSession session, Throwable exception) {
        exception.printStackTrace();
}

}

Если я определю свои собственные зависимости Websocket в pom.xml, у меня не будет проблем. Делая это, я также не запускаю встроенный Tomcat

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-messaging</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-websocket</artifactId>
    </dependency>
    <dependency>
        <groupId>javax.websocket</groupId>
        <artifactId>javax.websocket-api</artifactId>
        <version>1.1</version>
    </dependency>
    <dependency>
        <groupId>javax.websocket</groupId>
        <artifactId>javax.websocket-client-api</artifactId>
        <version>1.1</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.tyrus.bundles</groupId>
        <artifactId>tyrus-standalone-client</artifactId>
        <version>1.10</version>
    </dependency>
        <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

person Langfo    schedule 27.05.2015    source источник
comment
Удалось ли вам решить эту проблему. Я тоже получаю ту же ошибку. Настройки сердцебиения тоже не помогают.   -  person Anand Nadar    schedule 15.12.2015
comment
У меня был крайний срок, поэтому я придерживался вышеуказанных зависимостей.   -  person Langfo    schedule 12.01.2016


Ответы (1)


Я думаю, что моя проблема могла быть связана с тем, что в моем pom.xml отсутствует зависимость Spring-Messaging. Следующие зависимости позволяют моему приложению websocket работать в Spring Boot Release 1.3.1.

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-messaging</artifactId>
</dependency>
person Langfo    schedule 10.02.2016
comment
есть тот же баг, но зависимости не помогают = ( - person z0mb1ek; 05.04.2016