Spring WebSocket如何向特定用户发送消息?

时间:2015-11-15 13:45:07

标签: spring websocket stomp

我正在阅读本书Spring in Action 4,以便通过WebSocket处理STOMP消息传递。

假设/如下:

server {
    listen 80;
    server_name site.app;
    root /var/www/site.app/public;

    rewrite_log on;
    error_log /var/log/nginx/error.log debug;

    index index.php index.html;

    location / {
        try_files $uri $uri/ index.php?$query_string;
    }

    location /news/ {
        root /var/www/news/api;
        rewrite ^/news/(.*) /api.php?_=$1;
        index index.php index.html;
    }

    location ~ \.(hh|php)$ {
        try_files $uri /index.php =404;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

然后客户使用以下JavaScript代码订阅目的地:

user destination prefix is set as "/user"

然后在服务器上,registry.setUserDestinationPrefix("/user"); 客户端订阅的stomp.subscribe("/user/queue/notifications", handleNotifications); 目的地应该从其会话中 派生 ,可能是这样的:< / p>

actual

然后我使用the向该用户发送消息:

/queue/notifications-user6hr83v6t  --- (1)

然后消息将像这样发送到目的地:

SimpMessagingTemplate

嗯,两个目的地messaging.convertAndSendToUser( username, "/queue/notifications", new Notification("You just got mentioned!")); /user/<username>/queue/notifications ---(2) 看起来不一样,这条消息怎么会传到客户端?

1 个答案:

答案 0 :(得分:3)

路径

/user/<username>/queue/notifications 

似乎是&#34;逻辑&#34;文档中使用的路径。它最初也是使用convertAndSendToUser方法创建的。然后将其翻译成技术格式,在此行的UserDestinationMessageHandler类中完成

UserDestinationResult result = this.destinationResolver.resolveDestination(message);

例如。

鉴于订阅:

stompClient.subscribe('/user/queue/reply', function (greeting) { ...

发送

的消息
stompClient.send("/app/personal", ...

并用

拦截它
@MessageMapping("/personal")
public void personalMessage(SimpMessageHeaderAccessor headerAccessor, PoCRequestMessage message) {

    SimpMessageHeaderAccessor ha = SimpMessageHeaderAccessor
            .create(SimpMessageType.MESSAGE);
    ha.setSessionId(headerAccessor.getSessionId());
    ha.setLeaveMutable(true);
    PoCReplyMessage reply = new PoCReplyMessage("Personal Message" + message.getName());
    simpMessagingTemplate.convertAndSendToUser(headerAccessor.getSessionId(), "/queue/reply", reply, ha.getMessageHeaders());
}

目的地将按如下方式解决:

source destination: /user/zojdn53y/queue/reply
target destination: /queue/reply-userzojdn53y

这是最终目的地名称的解析方式。 目标目标是创建的队列的真实名称(至少在使用外部消息代理时也是如此 - 没有为一个简单的内存代理检查这个,但我认为这将是相同的)。 / p>

需要注意的一件重要事情是,当您想要使用未经身份验证的用户时(通常在尝试使用Websockets时的场景),您需要另外将消息头放在convertAndSendToUser方法中 - 这在

Spring WebSocket @SendToSession: send message to specific session