SpringBoot-WebSocket 使用SimpMessagingTemplate发送后前端无法监听到消息

最近聊天室项目遇到了这样一个操蛋的问题:前端监听subscribe后端的topicHome和topicChat两个接口,但永远只有topicChat接口有返回。前后端排除问题一个多小时定位到了后端出现的问题:

原先后端webSocket配置的Broker如下

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        //表示客户端订阅地址的前缀信息,也就是客户端接收服务端消息的地址的前缀信息
        registry.enableSimpleBroker("/topicHome");
        registry.enableSimpleBroker("/topicChat");
        //指服务端接收地址的前缀,意思就是说客户端给服务端发消息的地址的前缀
        registry.setApplicationDestinationPrefixes("/app");
    }
检查发现,enableSimpleBroker是一个Set方法而不是一个add方法,这样添加两个SimplerBroker后一个接口就会覆盖掉前一个接口,所以topicHome接口是一个被替代的接口

修改后

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        //表示客户端订阅地址的前缀信息,也就是客户端接收服务端消息的地址的前缀信息
        registry.enableSimpleBroker("/topicHome","/topicChat");
        //指服务端接收地址的前缀,意思就是说客户端给服务端发消息的地址的前缀
        registry.setApplicationDestinationPrefixes("/app");
    }

发现这样还是不行,变成topicChat不能返回了,看下这个方法的源码

    public SimpleBrokerRegistration enableSimpleBroker(String... destinationPrefixes) {
        this.simpleBrokerRegistration = new SimpleBrokerRegistration(this.clientInboundChannel, this.clientOutboundChannel, destinationPrefixes);
        return this.simpleBrokerRegistration;
    }

接收的是一个不定参数destinationPrefixes

于是再修改成

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        //表示客户端订阅地址的前缀信息,也就是客户端接收服务端消息的地址的前缀信息
        String[] strings = new String[]{"/topicHome","/topicChat"};
        registry.enableSimpleBroker(strings);
        //指服务端接收地址的前缀,意思就是说客户端给服务端发消息的地址的前缀
        registry.setApplicationDestinationPrefixes("/app");
    }

成功了,真是个简单确非常隐蔽的bug…

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值