【问题标题】:Spring 4.1.1 WebSocket Stomp Subprotocol errorSpring 4.1.1 WebSocket Stomp 子协议错误
【发布时间】:2014-12-27 23:12:28
【问题描述】:

我们刚刚尝试将我们的一个项目从 Spring 4.0.7.RELEASE 迁移到 4.1.1.RELEASE。 之后,我们得到以下错误。

java.lang.IllegalStateException: Multiple protocol handlers configured and no protocol was negotiated. Consider configuring a default SubProtocolHandler.
at org.springframework.web.socket.messaging.SubProtocolWebSocketHandler.findProtocolHandler(SubProtocolWebSocketHandler.java:294)
at org.springframework.web.socket.messaging.SubProtocolWebSocketHandler.clearSession(SubProtocolWebSocketHandler.java:433)
at org.springframework.web.socket.messaging.SubProtocolWebSocketHandler.afterConnectionClosed(SubProtocolWebSocketHandler.java:423)
at org.springframework.web.socket.handler.WebSocketHandlerDecorator.afterConnectionClosed(WebSocketHandlerDecorator.java:85)
at org.springframework.web.socket.handler.LoggingWebSocketHandlerDecorator.afterConnectionClosed(LoggingWebSocketHandlerDecorator.java:71)
at org.springframework.web.socket.handler.ExceptionWebSocketHandlerDecorator.afterConnectionClosed(ExceptionWebSocketHandlerDecorator.java:91)
at org.springframework.web.socket.sockjs.transport.session.AbstractSockJsSession.close(AbstractSockJsSession.java:291)
at org.springframework.web.socket.handler.ExceptionWebSocketHandlerDecorator.tryCloseWithError(ExceptionWebSocketHandlerDecorator.java:60)
at org.springframework.web.socket.handler.ExceptionWebSocketHandlerDecorator.afterConnectionEstablished(ExceptionWebSocketHandlerDecorator.java:50)
at org.springframework.web.socket.sockjs.transport.session.AbstractSockJsSession.delegateConnectionEstablished(AbstractSockJsSession.java:207)
at org.springframework.web.socket.sockjs.transport.session.WebSocketServerSockJsSession.initializeDelegateSession(WebSocketServerSockJsSession.java:159)
at org.springframework.web.socket.sockjs.transport.handler.SockJsWebSocketHandler.afterConnectionEstablished(SockJsWebSocketHandler.java:87)
at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter.onOpen(StandardWebSocketHandlerAdapter.java:101)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.init(WsHttpUpgradeHandler.java:129)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:633)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1721)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1679)
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)

我们没有对配置进行任何更改(也找不到任何提示我们必须更改任何内容)。

这是我们的 WebSocket 的服务器端配置。 (实际上和 Spring 文档中的一样)。

@Configuration
@EnableWebSocketMessageBroker

public class WebSocketConfiguration extends AbstractWebSocketMessageBrokerConfigurer {

@Override
public void registerStompEndpoints(final StompEndpointRegistry registry) {
    registry.addEndpoint("/tyresearch").withSockJS();
    registry.addEndpoint("/tyresearch/changeConfiguration").withSockJS();
    registry.addEndpoint("/tyresearch/detailView").withSockJS();
}

@Override
public void configureMessageBroker(final MessageBrokerRegistry config) {
    config.enableSimpleBroker("/topic");
    config.setApplicationDestinationPrefixes("/app");
}
}

我们对前面描述的每个端点都有如下方法:

@MessageMapping("/tyresearch")
public void startTyreSearch(@Payload final TyreSearchRequestContainerDto message, final Principal user, final StompHeaderAccessor) {
    ....
}

来自 JavaScript 的客户端调用如下所示:

var socket = new $wnd.SockJS('/server/api/rest/tyresearch');
    var stompClient = $wnd.Stomp.over(socket);
    stompClient.connect({}, function(frame) {
        console.log('Connected: ' + frame);
    });

有人有什么想法,什么变化让我们在这里遇到麻烦以及如何解决这个问题?

非常感谢。

【问题讨论】:

    标签: spring stomp spring-websocket


    【解决方案1】:

    首先是一个bug。感谢您指出!

    我们提出了一个问题 (https://jira.spring.io/browse/SPR-12403),它将在下周修复。

    在此之前,你不能只用一个来克服 stomp 端点的麦芽映射吗?

    更新

    我收到一个错误,告诉我协议 stomp 1.0、1.1 和 1.2 已经映射

    由于我们确实在这里遇到了问题并且您需要以某种方式克服它,我建议您尝试覆盖 bean:

    @Bean
        public WebSocketHandler subProtocolWebSocketHandler() {
            return new SubProtocolWebSocketHandler(clientInboundChannel(), clientOutboundChannel());
        }
    

    使用您的自定义实现,其中addProtocolHandler 将有一个空主体,因为您说您已经将STOMP 定义为默认值。有了这个框架将无法添加更多SubProtocolHandlers。

    【讨论】:

    • 您好,感谢您的回答。我尝试设置 defaultSubProtocols 之类的东西,但随后遇到了不同的其他错误(例如,如果我在 SubProtocolWebSocketHandler bean 上将 stomp 协议明确设置为默认值,我收到一个错误,告诉我协议 stomp 1.0、1.1 和 1.2 是已经映射)也许我在这里做错了,所以如果你有一个示例配置我可以如何实现这一点,我会尝试一下。
    • 该问题已在 4.1.2 中修复 - 将于本周发布。
    • 解决方法有效。非常感谢您的快速答复。 :)
    猜你喜欢
    • 2017-04-20
    • 2020-10-27
    • 2016-05-06
    • 2020-06-17
    • 2016-06-28
    • 2016-12-22
    • 1970-01-01
    • 2019-11-09
    • 2017-05-31
    相关资源
    最近更新 更多