У меня разные части страницы обновляются в разное время сообщениями веб-сокетов. Если по какой-либо причине происходит сбой сетевого подключения к серверу (в течение любого периода от нескольких секунд до нескольких дней), мне нужно вернуть страницу в правильное состояние.
Я использую веб-сокеты Spring на бэкенде, а SockJS и STOMP.js на переднем конце (встроенный в Angular).
В 1. Любая часть этого кэша отправляет сообщения веб-сокетов (я использую веб-сокеты только один путь, от сервера к клиенту), а затем обнаруживает сбой сети и отправляет сохраненные сообщения при восстановлении соединения? (поэтому этот сценарий автоматически вернет страницу в правильное состояние)
В 2. В противном случае мне нужно как-то обнаружить потерю сетевого подключения - как это сделать точно?
(Затем я запускаю полную перезагрузку страницы из внешнего интерфейса - это бит, который я могу легко сделать)
Мой бэкэнд находится в Groovy, с использованием Spring Websockets, т. Е .:
import org.springframework.messaging.simp.SimpMessagingTemplate
SimpMessagingTemplate brokerMessagingTemplate
brokerMessagingTemplate.convertAndSend('/topic/updatepage', pageComponentMessage)
с этим для конфигурации:
@CompileStatic
@Configuration
@EnableWebSocketMessageBroker
class MySocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
void configureMessageBroker(MessageBrokerRegistry messageBrokerRegistry) {
messageBrokerRegistry.enableSimpleBroker "/queue", "/topic"
messageBrokerRegistry.setApplicationDestinationPrefixes "/app"
}
@Override
void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
stompEndpointRegistry.addEndpoint("/stomp").setAllowedOrigins("*").withSockJS()
}
@Bean
GrailsSimpAnnotationMethodMessageHandler grailsSimpAnnotationMethodMessageHandler(
SubscribableChannel clientInboundChannel,
MessageChannel clientOutboundChannel,
SimpMessageSendingOperations brokerMessagingTemplate
) {
def handler = new GrailsSimpAnnotationMethodMessageHandler(clientInboundChannel, clientOutboundChannel, brokerMessagingTemplate)
handler.destinationPrefixes = ["/app"]
return handler
}
@Bean
GrailsWebSocketAnnotationMethodMessageHandler grailsWebSocketAnnotationMethodMessageHandler(
SubscribableChannel clientInboundChannel,
MessageChannel clientOutboundChannel,
SimpMessageSendingOperations brokerMessagingTemplate
) {
def handler = new GrailsWebSocketAnnotationMethodMessageHandler(clientInboundChannel, clientOutboundChannel, brokerMessagingTemplate)
handler.destinationPrefixes = ["/app"]
return handler
}
}
и угловой код переднего конца:
export class MyWSService {
private sockjsclient = null; // SockJS socket that connects to the server (preferably using a WebSocket)
private stompClient = null; // Stomp client that handles sending messages over the WebSocket
subscribeToTopic(topic: string, subInstance: any, callbackfn): any {
// SockJS socket connection does not exist yet, set it up:
if(!this.sockjsclient) {
this.sockjsclient = new SockJS(myWebsocketUrl);
}
// If STOMP instance (to send messages over the socket) does not exist yet, set it up:
if(!this.stompClient) {
this.stompClient = Stomp.over(this.sockjsclient);
this.stompClient.connect({}, () => {
subInstance.wsSubscription = this.stompClient.subscribe(topic, (message) => callbackfn(message));
})
}
// STOMP instance already exists, so use that existing connection:
else {
subInstance.wsSubscription = this.stompClient.subscribe(topic, (message) => callbackfn(message));
}
}
unsubscribeFromTopic(subscription: any) {
subscription.unsubscribe(); // Unsubscribe from topic
}
}
Спасибо