春季启动websocket通知片状



我正在Angular中使用Spring Boot WebSocket通知和Stomp客户端库来连接和订阅WebSocket。然而,有时我会在UI屏幕上收到通知,有时我不会收到通知。行为中存在片状。

有人能给我推荐解决方案吗?

public getNotification(){
var isConnected = this.notification.initConnnection();
const _this=this;
_this.stompClient.connect({}, function (frame){
const url='topic/topicName';
_this.StompClient.subscribe(url,(message)=>{
console.log(message)
});
},_this.stompCallBack);
)
}
public stopCallBack;any function(error){
console.log(error)
setTimeOut(this.notification,10000)
}

服务器端:

@Autowire
SimMessagingTemplate simMessagingTemplate;

simMessagingTemplate.convertAndSend('topic/topicName', message)

以下是配置示例:

@Slf4j
@Configuration
@EnableWebSocketMessageBroker
@RequiredArgsConstructor
public class NotificationsWebSocketConfig implements WebSocketMessageBrokerConfigurer {
....
@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
registration.interceptors(new ChannelInterceptor() {
@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
if (isNull(accessor) || isNull(accessor.getCommand())) {
log.warn("Unable to subscribe/unsubscribe: accessor or command is empty.");
return message;
}
switch (accessor.getCommand()) {
case SUBSCRIBE: {
wsSessionService.subscribe(accessor);
break;
}
case UNSUBSCRIBE:
case DISCONNECT:
case ABORT:
wsSessionService.unsubscribe(accessor);
break;
}
return message;
}
});
}

wsSessionService包含一些内置逻辑。此服务/组件存储所有活动会话,并使用以下内容将所有通知发送到目的地:

@Slf4j
@Service
@RequiredArgsConstructor
public class MessageSender {
private final ObjectMapper mapper;
private final SimpMessagingTemplate simpMessagingTemplate;
@SneakyThrows
public <T> void sendMessage(String destination, T payload) {
if (isNull(destination) || isNull(payload)) {
log.warn("Destination or payload is empty. Cannot send message.");
return;
}
Map<String, Object> headers = new HashMap<>();
headers.put("content-type", MediaType.APPLICATION_JSON_UTF8);
MessageHeaders messageHeaders = new MessageHeaders(headers);
byte[] bytes = mapper.writeValueAsBytes(payload);
Message<Object> message = MessageBuilder.createMessage(bytes, messageHeaders);
log.debug("Incoming  message for to destination -> {}", destination);
simpMessagingTemplate.send(destination, message);
}
}

最新更新