【问题标题】:Spring Websocket Reply To User Message FlowSpring Websocket 回复用户消息流
【发布时间】:2015-08-08 11:06:21
【问题描述】:

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

我发现了以下内容:

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

其中包括:

回复用户

@Controller
public class GreetingController {

  // Message sent to "/user/{username}/queue/greetings"

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

}

以上似乎暗示发送到“/user/{username}/queue/greetings”的消息将在将返回值发送给指定用户之前调用 greet 方法。

当我向这个目的地发送一条消息时,它会直接发送给用户,而无需通过 greet 控制器方法进行处理。

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

【问题讨论】:

    标签: spring-websocket


    【解决方案1】:

    @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);
    }
    

    【讨论】:

    【解决方案2】:

    我能找到的一切都指向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);
      }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-28
      • 1970-01-01
      • 1970-01-01
      • 2020-05-06
      • 2016-02-16
      • 2014-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多