lenve / vhr

微人事是一个前后端分离的人力资源管理系统,项目采用SpringBoot+Vue开发。
http://vhr.javaboy.org
27.4k stars 10.3k forks source link

为什么是/user/queue/chat,而不是/queue/chat? #43

Closed msh01 closed 6 years ago

msh01 commented 6 years ago

下面的这行代码看不懂,为什么是/user/queue/chat,而不是/queue/chat

context.state.stomp.subscribe("/user/queue/chat", message=> {......}

这个/user前缀是哪儿来的?后端配置的是只能识别/queue开头的或者/topic开头的,为什么/user/queue开头的也能识别?百思不得其解

msh01 commented 6 years ago

找到答案了: 在后端代码里面全局搜索/user,发现/user出现在了springSimpMessagingTemplate类的源码中,这个类里面有个属性:

private String destinationPrefix = "/user/";

我想,我大概找到问题的方向了。。。。 原来在方法调用的时候,传入的destination参数"/queue/chat"

messagingTemplate.convertAndSendToUser(destUser, "/queue/chat", new ChatResp(message, principal.getName()));

然而在SimpMessagingTemplate的方法内,destination参数会被再次经过加工:

super.convertAndSend(this.destinationPrefix + user + destination, payload, headers, postProcessor);

最后真正的destination会是this.destinationPrefix + user + destination,例如"/queue/chat""/user/libai/queue/chat"