我正在将java springboot与maven结合使用,以获取spring boot starter套接字包。我的客户在stompjs和sockjs-client中使用angular。 我正在尝试建立一个简单的Web套接字应用程序,该应用程序允许基于roomId的多个房间。客户加入会议室后,他们应该会收到该会议室中发送的最后五个消息。
我的Springboot应用程序具有三个类,用于运行该应用程序的基本Application.java,一个Web套接字配置类和一个Web套接字控制器:
@Controller
public class WebSocketController {
private final SimpMessagingTemplate template;
@Autowired
WebSocketController(SimpMessagingTemplate template){
this.template = template;
}
@MessageMapping("/meeting/{roomId}")
private void sendMessageTpPrivateRoom(
String message,
@DestinationVariable String roomId
) throws IOException {
System.out.println("message sent to: " + roomId);
this.template.convertAndSend("/meeting/" + roomId, message);
addToHistory(roomId, message);
}
@SubscribeMapping("/meeting/{roomId}")
public String chatInit(@DestinationVariable String roomId) {
System.out.println("Someone joined room: " + roomId);
return getLastFiveMessages(roomId);
}
}
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration
extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/socket")
.setAllowedOrigins("*")
.withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.setApplicationDestinationPrefixes("/app")
.enableSimpleBroker("/meeting");
}
}
我的客户正像这样订阅套接字:
stompClient.subscribe(`app/meeting/${roomId}`, (message) => {
if (message.body) {
console.log(message.body);
messages += '<br>' + message.body;
}
});
并像这样发送消息:
this.stompClient.send(`/app/meeting/${this.roomId}` , {}, message);
当我设置三个客户时,邮件发送和处理工作非常好,其中两个在第一房间,一个在第二房间,在第一房间看不到第二房间的消息,而在两个房间都看到第一房间的消息客户。
但是无论我加入哪个房间,订阅事件都不会触发。当客户加入一个房间时,非常有必要获得该房间的某种历史记录。 关于客户预订会议室时为何未触发我的SubscribeMapping方法的任何建议吗?
答案 0 :(得分:2)
/meeting
部分将被隐式添加到您在订阅时提供的URL中。因此,您的映射将如下所示:
@SubscribeMapping("/${roomId}")
public String chatInit(@DestinationVariable String roomId) {
System.out.println("Someone joined room: " + roomId);
return getLastFiveMessages(roomId);
}