Spring使用STOMP的多个房间

时间:2015-02-07 20:44:57

标签: spring websocket stomp 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 + "!");
}

拥有@SendTo(" / room / {room}")

是理想的选择 但是,我受限于:

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

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

客户是:

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

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

1 个答案:

答案 0 :(得分:19)

看起来像这样"房间" feature实际上是一个发布/订阅机制,是在Spring Websocket支持中使用主题实现的(有关详细信息,请参阅STOMP protocol support and destinations)。

通过这个例子:

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

}

我认为快速查看the reference documentation,一些有用的示例,例如portfolio appchat app应该很有用。