【问题标题】:Why isnt my sockets onsubscribe event getting used?为什么我的套接字取消订阅事件没有被使用?
【发布时间】:2019-09-05 15:04:37
【问题描述】:

我使用 java springboot 和 maven 来获取 spring boot 启动器套接字包。我的客户正在使用带有 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 方法的任何建议?

【问题讨论】:

    标签: spring-boot sockets websocket spring-websocket stomp


    【解决方案1】:

    /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

    【讨论】:

    • 所以实际上我只需要在订阅路径前加上“app”,所以完整路径是“app/meeting/roomId”。现在,当我加入房间时,我会收到我的信息!但是现在有一个问题,我订阅了 app/meeting/roomId 但是当我发送消息时,因为我不再订阅常规的 /meeting/roomId 似乎我不再收到我发送的消息。我得到的唯一响应来自 subscribeMapping,我认为这是因为它不再通过代理。知道如何让经纪人发送到 app/meeting/roomId 吗?以上更新以反映
    • 似乎期望每个客户端都需要订阅 app/meeting/roomId 和 /meeting/roomId 才能获得订阅响应以及所有未来的消息?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 2020-01-01
    • 1970-01-01
    相关资源
    最近更新 更多