诊断Spring WebSocket用户目标的问题

Ste*_*eve 5 java spring stomp spring-boot spring-websocket

我无法让用户目的地使用Spring STOMP websockets.

我似乎有一般的配置工作.例如,以下工作.

客户:

svc.stompClient.subscribe('/queue/messages', msg );
Run Code Online (Sandbox Code Playgroud)

服务器:

stompTemplate.convertAndSend("/queue/messages", msg);
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试发送到特定用户目标时,如下所示:

客户:

svc.stompClient.subscribe('/user/queue/messages', msg );
Run Code Online (Sandbox Code Playgroud)

服务器:

stompTemplate.convertAndSendToUser(username, "/queue/messages", msg);
Run Code Online (Sandbox Code Playgroud)

......似乎没有任何事情发生.

我有设置SessionConnectedEventSessionSubscribeEvent听众,显示:

SessionConnectedEvent[GenericMessage [
    payload=byte[0], 
    headers={
        simpMessageType=CONNECT_ACK, 
        simpConnectMessage=GenericMessage [
            payload=byte[0], 
            headers={
                simpMessageType=CONNECT, 
                stompCommand=CONNECT, 
                nativeHeaders={
                    accept-version=[1.1,1.0], 
                    heart-beat=[10000,10000]
                }, 
                simpSessionAttributes={}, 
                simpSessionId=erlz0dm6
            }
        ], 
        simpSessionId=erlz0dm6
    }
]]

SessionSubscribeEvent[GenericMessage [
    payload=byte[0], 
    headers={
        simpMessageType=SUBSCRIBE, 
        stompCommand=SUBSCRIBE, 
        nativeHeaders={
            id=[sub-0], 
            destination=[/user/queue/messages]
        }, 
        simpSessionAttributes={}, 
        simpSubscriptionId=sub-0, 
        simpSessionId=erlz0dm6, 
        simpDestination=/user/queue/messages
    }
]]
Run Code Online (Sandbox Code Playgroud)

在客户端,我看到以下记录:

 >>> SUBSCRIBE
id:sub-0
destination:/user/queue/messages
Run Code Online (Sandbox Code Playgroud)

通过该sendToUser方法跟踪某些方法,我可以看到它正在传递/user/myusername/queue/messages到目标解析器.但是,服务器上不会记录任何其他内容,并且客户端不会收到该消息.

所以我很想确定:

  • 是否有我可以启用的调试日志记录,这可能有助于诊断问题?
  • 我可能遇到过任何常见的配置陷阱吗?

如果有任何其他信息(即代码)可以提供帮助诊断问题,请告诉我.问题已经很长了,所以我试图避免使用过多的无关代码来混淆它.

我正在使用:

  • Spring Boot 1.2.1(与1.0.8相同的问题.我升级以查看它是否有帮助.)
  • sockjs-client 0.3.4
  • stomp-websocket 2.3.1

此外,如果它是相关的,我使用a PreAuthenticatedAuthenticationProvider来确定用户,并HttpServletRequestWrapper确保标题中定义的用户名作为Principal名称提供.即上面代码中的用户名是我的Active Directory域用户名.

注意 - 我已经检查了这个问题,听起来有点类似.然而,他们的"工作代码"是我努力工作的一点,没有成功.