Spring 4 websocket和stomp - 未到达控制器

Posted

技术标签:

【中文标题】Spring 4 websocket和stomp - 未到达控制器【英文标题】:Spring 4 websocket And stomp - controller is not reached 【发布时间】:2014-04-22 14:14:44 【问题描述】:

我使用的是spring的官方示例(Greeting example),位于:

http://spring.io/guides/gs/messaging-stomp-websocket/

一切似乎都很好,当我按下连接时,我可以看到正在建立与服务器的连接。

但是,连接后,当我向服务器提交“名称”时,我没有收到任何错误,也没有请求到达 GreetingController。

我试图将日志级别放在跟踪上,当我执行“发送”时看到以下行:

22 Ar 2014 17:10:52 DEBUG DispatcherServlet - Successfully completed request
22 Apr 2014 17:10:52 DEBUG ExceptionTranslationFilter - Chain processed normally
22 Apr 2014 17:10:52 DEBUG HttpSessionSecurityContextRepository - SecurityContext is empty or contents are anonymous - context will not be stored in HttpSession.
22 Apr 2014 17:10:52 DEBUG SecurityContextPersistenceFilter - SecurityContextHolder now cleared, as request processing completed
22 Apr 2014 17:10:52 DEBUG LoggingWebSocketHandlerDecorator - Connection established, SockJS session id=taxwn2fu, uri=/MyWebApp/hello/535/taxwn2fu/websocket
22 Apr 2014 17:10:52 DEBUG SubProtocolWebSocketHandler - Started WebSocket session=taxwn2fu, number  of sessions=1
22 Apr 2014 17:10:53 DEBUG StompDecoder - Decoded [Payload byte[0]][Headers=stompCommand=CONNECT, nativeHeaders=heart-beat=[10000,10000], accept-version=[1.1,1.0], simpMessageType=CONNECT,  id=0686dda9-afa3-7a54-756c-89279ea33126, timestamp=1398175853000]
22 Apr 2014 17:10:53 DEBUG StompEncoder - Encoded STOMP command=CONNECTED headers=heart-beat=[0,0], version=[1.1]
22 Apr 2014 17:10:53 DEBUG StompDecoder - Decoded [Payload byte[0]][Headers=stompCommand=SUBSCRIBE, nativeHeaders=id=[sub-0], destination=[/topic/greetings], simpMessageType=SUBSCRIBE, simpSubscriptionId=sub-0, simpDestination=/topic/greetings, id=653538d3-0722-0325-2c23-8314abd70cc0, timestamp=1398175853008]
22 Apr 2014 17:10:53 DEBUG DefaultSubscriptionRegistry - Adding subscription id=sub-0, destination=/topic/greetings
22 Apr 2014 17:10:56 DEBUG StompDecoder - Decoded [Payload byte[17]][Headers=stompCommand=SEND, nativeHeaders=content-length=[17], destination=[/app/hello], simpMessageType=MESSAGE, simpDestination=/app/hello, id=f9a608c0-6e02-7828-a057-a6b2b07b6af7, timestamp=1398175856489]
22 Apr 2014 17:10:56 DEBUG SimpAnnotationMethodMessageHandler - Handling message, lookupDestination=/hello

有什么想法吗?

P.S,这是我使用的js代码的一部分(与网站相同):

    function connect() 
        var socket = new SockJS('/MyWebApp/hello');
        stompClient = Stomp.over(socket);
        stompClient.connect(, function(frame) 
            setConnected(true);
            console.log('Connected: ' + frame);
            stompClient.subscribe('/topic/greetings', function(greeting)
                showGreeting(JSON.parse(greeting.body).content);
            );
        );
    

    function disconnect() 
        stompClient.disconnect();
        setConnected(false);
        console.log("Disconnected");
    

    function sendName() 
        debugger;
        var name = document.getElementById('name').value;
        stompClient.send("/app/hello", , JSON.stringify( 'name': name ));
    

【问题讨论】:

【参考方案1】:

好吧,服务器正在捕获消息,但它对此无能为力。所以,我认为你应该:

    注意这一行"config.setApplicationDestinationPrefixes("/app");"在 WebSocketConfig 类上; 确保您的 Controller 使用 @Controller 注释,方法使用 @MessageMapping("/hello"); 进行注释

【讨论】:

【参考方案2】:

好的,我有一个spring配置问题,我没有扫描必要的bean目录。

【讨论】:

你能不能至少写下你把@ComponentScan注解放在哪里以及为什么?

以上是关于Spring 4 websocket和stomp - 未到达控制器的主要内容,如果未能解决你的问题,请参考以下文章

Spring 4 websocket和stomp - 未到达控制器

Spring 4 - websocket 消息传递 stomp 处理程序

Spring 4 STOMP Websockets Heartbeat

Spring with STOMP over SockJS 和 Tomcat 未升级到 Websockets

Spring+Stomp+ActiveMq实现websocket长连接

Spring+Stomp+ActiveMq实现websocket长连接