使用STOMP在Spring中实现多房间

20

可以使用STOMP和Spring 4创建房间吗?Socket.IO内置了房间,所以我想知道Spring是否也有此功能。

我目前的代码:

@MessageMapping("/room/greet/{room}")
@SendTo("/room/{room}")
public Greeting greet(@DestinationVariable String room, HelloMessage message) throws Exception {
    return new Greeting("Hello, " + room + "!");
}

最理想的是使用@SendTo("/room/{room}")

然而,我受限于:

@SendTo("/room/room1") 
@SendTo("/room/room2")
@SendTo("/room/room3") 

等等......这非常不理想

客户是:

stompClient.subscribe('/room/' + roomID, function(greeting){
    showGreeting(JSON.parse(greeting.body).content);
});

房间编号可以是room1、room2或room3... 如果我需要更多的房间怎么办?现在感觉这很繁琐。

2个回答

41

看起来这个“room”功能实际上是一种发布/订阅机制,可以使用Spring Websocket支持中的主题来实现(有关此内容的更多信息,请参见STOMP协议支持和目的地)。

以这个例子为例:

@Controller
public class GreetingController {

  @MessageMapping("/room/greeting/{room}")
  public Greeting greet(@DestinationVariable String room, HelloMessage message) throws Exception {
    return new Greeting("Hello, " + message.getName() + "!");
  }

}
如果消息被发送到“/room/greeting/room1”,则返回值Greeting将自动发送到“/topic/room/greeting/room1”,因此初始目标前缀为“/topic”。 如果您希望自定义目标,则可以像以前一样使用@SendTo,或者使用MessagingTemplate,例如:
@Controller
public class GreetingController {

  private SimpMessagingTemplate template;

  @Autowired
  public GreetingController(SimpMessagingTemplate template) {
    this.template = template;
  }

  @MessageMapping("/room/greeting/{room}")
  public void greet(@DestinationVariable String room, HelloMessage message) throws Exception {
    Greeting greeting = new Greeting("Hello, " + message.getName() + "!");
    this.template.convertAndSend("/topic/room/"+room, greeting);  
  }

}

我认为快速浏览参考文档和一些有用的示例,例如投资组合应用程序聊天应用程序,会很有用。


这也许会有用 https://dev59.com/fl8d5IYBdhLWcg3wNQNg#27055764 - Sergi Almar
你的源代码其他部分是否有其他地方可以获取?我只是想知道还需要哪些配置才能使其正常工作。 - Jordan Mackie

0

你可以在Java中使用Netty Socket实现Socket IO


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接