最近聊天室项目遇到了这样一个操蛋的问题:前端监听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…