我正在使用 websockets 创建一个简单的客户端-服务器演示。在这个演示中客户端可以订阅不同的主题。每当服务器有任何内容要发送时,它只会发送有关适当主题的消息,并且只有订阅的客户端才会收到相同的消息。
我的服务器每当将消息发送到任何主题时都应该得到确认,但我有点困惑,当发送方法返回时,我应该如何获得已发送消息的确认
void
下面是我的 WebSocketConfig 类,
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/testApp");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/message").withSockJS();
}
}
以下是主题订阅如何在客户端发生,
var topic = '/testApp/testTopic';
stompClient.subscribe(topic, function(greeting){
});
下面是我的服务器如何向特定的主题,
发送消息 String message = "test message";
this.template.convertAndSend(topic, new Chat(message));
上述方法(即
this.template.convertAndSend(topic, new Chat(message));
)返回void
最后我能够成功地将消息发送到所有/特定订阅的客户端,但不知道如何确保消息是否在另一端成功传递?
您可以使用拦截器来拦截从服务器发送的消息。
您可以在此处找到示例:
您必须创建一个实现
ChannelInterceptor
接口的类并重写一个(或多个)方法,以在精确的时刻(例如在发送之前或之后)拦截消息;那么你必须在你的 WebSocketConfig
类中注册这个拦截器:
@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
registration.interceptors(new MyChannelInterceptor());
}
}
您可以重写的所有方法都在 spring ChannelInterceptor 文档中列出。
如果我很好地理解了你的问题,你应该重写
afterRecieveCompletition
方法。
但是,如果您只需要发送消息的日志,则可以启用 Websocket 和消息传递调试日志,只需将其添加到您的
application.properties
:
logging.level.org.springframework.web.socket=DEBUG
logging.level.org.springframework.messaging.simp.broker=DEBUG