【问题标题】:Spring boot websocket notification flakinessSpring Boot websocket通知片状
【发布时间】:2021-08-22 18:08:41
【问题描述】:

我在 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)

【问题讨论】:

  • 向您的问题添加更多信息。
  • 您采取了哪些步骤来诊断问题?调查产生了什么结果?你做了什么来尝试解决这个问题?
  • 如果我知道你在评论中询问的细节,我可以自己解决这个问题。
  • 所以您没有尝试以任何方式诊断问题?您还没有进行任何调查吗?甚至没有出现日志以查看每种情况下可能有什么不同?现在的问题是如此模糊,以至于您不太可能得到答案。甚至嗅探网络以查看通知是否正在发送到 UI 也会有所帮助。那么至少你会知道将调试工作集中在哪里。
  • 我试过了,我在日志中看到 websocket 连接在会话期间保持活动状态,有时仍然有 ui 收到通知,有时不是,我会在某个时候在这里发布后端和角度代码,这样您就可以看到我尝试过的内容。

标签: angular spring-boot spring-websocket stomp


【解决方案1】:

这是一个配置示例:

@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);
    }
}

【讨论】:

  • 这如何回答为什么 UI 有时没有收到通知的问题?
  • 您没有提供任何代码。也许您没有存储用于发送消息的会话,也许还有其他一些问题。如果没有完整的信息或代码示例,很难修复或提出建议 =) 我发送了示例,这些示例适用于 pout 错误。 (没找到)
猜你喜欢
  • 1970-01-01
  • 2018-12-31
  • 2018-09-19
  • 1970-01-01
  • 1970-01-01
  • 2016-05-06
  • 2020-06-17
  • 2015-07-24
  • 1970-01-01
相关资源
最近更新 更多