当前位置: 首页 > 知识库问答 >
问题:

Spring WebSocket回复用户消息流

余靖
2023-03-14

我试图发送一个私人的消息之间的用户使用Spring-网络插座。

我发现了以下内容:

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方法。

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

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

共有2个答案

慕阳
2023-03-14

我能找到的所有东西都指向以下模式的方向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);
  }

}
秦才良
2023-03-14

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

这种方法在内部使用SimpMessagingTem板,所以如果您使用的是4.2之前的版本,那么对于动态目的地使用SimpMessagingTem板没有任何错误:

@MessageMapping("/greetings/{username}")
public void greet(@Payload String greeting, @DestinationVariable("username") String username) {
  String message =  "[" + getTimestamp() + "]: " + greeting;
  simpMessagingTemplate.convertAndSend("/user/" + username + "/queue/greetings", message);
}
 类似资料:
  • 我使用Spring的STOMP over WebSocket实现与一个全功能的ActiveMQ代理。当用户向主题订阅时,在成功订阅之前必须通过一些权限逻辑。我使用ChannelInterceptor应用权限逻辑,如下所示: WebSocketConfig。爪哇: WebSocketSecurityConfig.java: MySubscriptionInterceptor。爪哇: 当没有足够权限的

  • 我正在尝试使用Springframework SimpMessageTemplate(默认Stomp实现)来流式传输时间序列数据,以将消息广播到SockJS客户端订阅的主题。但是,这些消息是按顺序接收的。服务器是单线程的,消息按时间戳升序发送。客户端以某种方式接收到了顺序错误的消息。 我使用的是stompjs和springframework的最新版本(4.1.6版本)。

  • 一、STOMP协议介绍 STOMP即Simple (or Streaming) Text Orientated Messaging Protocol,简单(流)文本定向消息协议,它提供了一个可互操作的连接格式,允许STOMP客户端与任意STOMP消息代理(Broker)进行交互。STOMP协议由于设计简单,易于开发客户端,因此在多种语言和多种平台上得到广泛地应用。 STOMP协议的前身是TTMP协

  • 我正在通过Spring集成设置一个TCP客户端,以字符串作为有效负载发送消息,不期望返回。也许序列化器/反序列化器不能正常工作?对不起,我正在学习Spring集成。 我可以通过oepnssl连接到外部TCP服务器: 我需要发送的命令是“sessions.list\n。\n”。 现在我构建了一个试图连接到服务器的tcp客户端: spring上下文。xml 因此,在这个repo之后,字符串应该转换为字

  • 概述 为了能够让轻应用订阅号的开发者接收到用户在消息窗口的留言消息,开发者可以在管理后台设置消息服务器并开启接收用户对话消息模式。 设置消息服务器时接需要提供可用的接收消息的回调URL地址,为了让通信更加安全,建议使用https。 设置成功并开启了接收对话消息模式后,用户在轻应用或订阅号窗口里发送的消息会推送给设置的URL,服务器接收到消息后,可以通过异步发送消息接口给用户回复消息。 设置消息服务

  • 它将打开WhatsApp,并将你带到特定的联系人,如果你已经保存,它将粘贴给定的文本,但它不会发送消息。 链接 他们正在访问通知以获取消息。我想知道他们是如何在没有打开应用程序的情况下在后台发送消息的。如果有人知道这个方法,请在这里分享。