【问题标题】:ConnectionLostException using Spring Boot with Tomcat WebsocketConnectionLostException 使用带有 Tomcat Websocket 的 Spring Boot
【发布时间】:2015-05-27 05:54:54
【问题描述】:

我有一个使用 Spring Boot 1.3.0-BUILD-SNAPSHOT 的 Java Stomp Websocket 客户端应用程序。这是我的 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();
}

}

如果我在 pom.xml 中定义自己的 Websocket 依赖项,则没有问题。通过这样做,我也没有启动嵌入式 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>

【问题讨论】:

  • 你能解决这个问题吗?我也遇到了同样的错误。心跳设置似乎也无济于事。
  • 我有一个截止日期,所以我坚持上述依赖项。

标签: spring spring-boot spring-websocket


【解决方案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>

【讨论】:

  • 有同样的bug,但是依赖没有帮助=(
猜你喜欢
  • 2018-04-18
  • 2018-09-25
  • 2020-02-25
  • 1970-01-01
  • 2019-11-16
  • 1970-01-01
  • 2017-09-14
  • 2016-12-22
  • 2018-01-13
相关资源
最近更新 更多