Я использую java springboot с maven для получения пакета стартового гнезда с пружинной загрузкой.Мои клиенты используют angular с stompjs и sockjs-client.Я пытаюсь настроить простое веб-приложение для сокетов, которое позволяет использовать несколько комнат на основе ID комнаты.Когда клиент присоединяется к комнате, он должен получать последние пять сообщений, отправленных в эту комнату.
В моем приложении Springboot есть три класса: базовый Application.java, который я использую для запуска приложения, класс конфигурации веб-сокета иконтроллер веб-сокета:
@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);
Отправка и обработка сообщений работают отлично, когда я настроил трех клиентов, двух в одной комнате и одного во второй комнате, сообщения второй комнаты не видны в первой комнате, а сообщения первой комнаты видны обоим клиентам.
Однако событие on подписки не срабатывает, независимо от того, к какой комнате я присоединяюсь.Очень важно, чтобы, когда клиент входит в первую комнату, он получал какую-то историю этой комнаты. Любой совет, почему мой метод SubscribeMapping не запускается, когда клиент подписывается на комнату?