Spring使用STOMP的多个房间

Dol*_*lan 10 spring stomp websocket spring-websocket

是否可以创建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 + "!");
}
Run Code Online (Sandbox Code Playgroud)

@SendTo("/ room/{room}")是理想的选择

但是,我受限于:

@SendTo("/room/room1") 
@SendTo("/room/room2")
@SendTo("/room/room3") 
Run Code Online (Sandbox Code Playgroud)

等......这非常非常不合理

客户是:

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

roomID可以是room1,room2或room3 ...如果我想要更多房间怎么办?现在感觉就像这样的痛苦

Bri*_*zel 24

看起来这个"房间"功能实际上是一个发布/订阅机制,这是通过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() + "!");
  }

}
Run Code Online (Sandbox Code Playgroud)

如果消息被发送到"/ 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 Greeting greet(@DestinationVariable String room, HelloMessage message) throws Exception {
    Greeting greeting = new Greeting("Hello, " + message.getName() + "!");
    this.template.convertAndSend("/topic/room/"+room, greeting);  
  }

}
Run Code Online (Sandbox Code Playgroud)

我想快速查看参考文档和一些有用的示例,例如投资组合应用程序聊天应用程序应该很有用.