为什么订阅活动中的套接字没有被使用?

问题描述 投票:2回答:1

我正在使用带有maven的java springboot来获得spring boot starter socket包。我的客户正在使用角度与stompjs和sockjs-client。我正在尝试设置一个简单的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);

消息发送和处理工作很好,当我设置三个客户端,两个在房间一,一个在房间二,房间两个消息没有在房间一看到,房间一个消息被两个客户看到。

但是,无论我加入什么房间,on subscribe事件都不会触发。非常有必要当客户加入第一个房间时,他们应该收到该房间的某种历史记录。有关为何在客户订阅房间时未触发我的SubscribeMapping方法的建议?

spring-boot sockets websocket spring-websocket stomp
1个回答
2
投票

/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

© www.soinside.com 2019 - 2024. All rights reserved.