Почему мои события сокетов на подписке не используются? - PullRequest
2 голосов
/ 15 апреля 2019

Я использую 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 не запускается, когда клиент подписывается на комнату?

1 Ответ

2 голосов
/ 24 апреля 2019

Часть /meeting будет неявно добавлена ​​к URL, который вы указали при подписке. Таким образом, ваше отображение будет выглядеть так:

    @SubscribeMapping("/${roomId}")
    public String chatInit(@DestinationVariable String roomId) {
        System.out.println("Someone joined room: " + roomId);
        return getLastFiveMessages(roomId);
    }

Источник: https://docs.spring.io/spring/docs/5.0.0.BUILD-SNAPSHOT/spring-framework-reference/html/websocket.html

...