Spring Websocket回复用户消息流

时间:2015-05-26 16:36:09

标签: spring-websocket

我正在尝试使用spring-websocket在用户之间发送私人消息。

我发现了以下内容:

https://github.com/rstoyanchev/springx2013-websocket/blob/master/spring-messaging/slides.md

包括:

向用户发送回复

#include <iostream>
using namespace std;

class Hello
{   private:
        int mess[];
    public:
        Hello() {
            mess = { 1, 3, 4, 546, 2 };
        }
};

int main()
{
    Hello h;
    return 0;
}

以上似乎暗示发送给&#34; / user / {username} / queue / greetings&#34;在将返回值发送给指定用户之前,将调用greet方法。

当我向此目的地发送邮件时,它会直接发送给用户,而不会被问候控制器方法处理。

我是否正确了解预期的流量?如果我不知道,在将消息发送给用户之前,我需要做些什么才能使用控制器方法处理消息。

2 个答案:

答案 0 :(得分:3)

@SendToUser注释定义方法的返回值应发送到前缀为/user/{username}的用户目标,其中用户名是从正在处理的输入消息的标题中提取的(当前用户) )。

在Spring 4.2中,您可以在@SendTo中使用占位符(仅限目标变量占位符,请参阅SPR-12170),如果您将用户名作为目标变量传递,则可以执行以下操作:

@MessageMapping("/greetings/{u}")
@SendTo("/user/{u}/queue/greetings")
public String greet(String greeting) {
    return "[" + getTimestamp() + "]: " + greeting;
}

此方法在内部使用SimpMessagingTemplate,因此如果您使用4.2之前的版本,则将SimpMessagingTemplate用于动态目标没有任何问题:

@MessageMapping("/greetings/{username}")
public void greet(@Payload String greeting, @DestinationVariable("username") String username) {
  String message =  "[" + getTimestamp() + "]: " + greeting;
  simpMessagingTemplate.convertAndSend("/user/" + username + "/queue/greetings", message);
}

答案 1 :(得分:0)

我能找到的所有内容都指向https://github.com/salmar/spring-websocket-chat中的以下模式的方向:

@MessageMapping("/chat.private.{username}")
public void filterPrivateMessage(@Payload ChatMessage message, @DestinationVariable("username") String username, Principal principal) {

    checkProfanityAndSanitize(message); 
    message.setUsername(principal.getName());
    simpMessagingTemplate.convertAndSend("/user/" + username + "/queue/chat.message", message);

}

应用于我的场景将成为:

@Controller
public class GreetingController {

  // Message sent to "/app/greetings/{username}"

  @MessageMapping("/greetings/{username}")
  public void greet(String greeting) {
      String message =  "[" + getTimestamp() + "]: " + greeting;
      simpMessagingTemplate.convertAndSend("/user/" + username + "/queue/greetings", message);
  }

}