如何确认websocket(spring websocket + stomp + sockjs)消息传递

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

我正在使用 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

最后我能够成功地将消息发送到所有/特定订阅的客户端,但不知道如何确保消息是否在另一端成功传递?

java spring stomp sockjs spring-websocket
1个回答
0
投票

您可以使用拦截器来拦截从服务器发送的消息。

您可以在此处找到示例:

您必须创建一个实现

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
© www.soinside.com 2019 - 2024. All rights reserved.