配置 WebSocketMessageBroker
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/queue");
registry.setApplicationDestinationPrefixes("/app");
}
连接目的地成功
订阅
编号:sub-0
目的地:/用户/队列/机器人
并从服务器端返回订阅事件
SessionSubscribeEvent[GenericMessage [payload=byte[0], headers={simpMessageType=SUBSCRIBE, stompCommand=SUBSCRIBE, nativeHeaders={id=[sub-0], destination=[/user/queue/bot]}, simpSessionAttributes={}, simpHeartbeat=[J@2881ad6c, simpSubscriptionId=sub-0, simpSessionId=l4lyrtxo, simpDestination=/user/queue/bot}]]
simpDestionation为/ user /queue/bot
让我们尝试向这个目的地发送消息
template.convertAndSendToUser(user, "/queue/bot", new UserResponse(UUID.randomUUID().toString()));
其中用户是当前的simpSessionId来自:
SessionConnectedEvent[GenericMessage [payload=byte[0],headers={simpMessageType=CONNECT_ACK,simpConnectMessage=GenericMessage [payload=byte[0],headers={simpMessageType=CONNECT,stompCommand=CONNECT,nativeHeaders={accept-version=[1.1, 1.0],心跳=[10000,10000]},simpSessionAttributes={},simpHeartbeat=[J@1f44ec3d,simpSessionId=l4lyrtxo}],simpSessionId=l4lyrtxo}]]
但是此消息在客户端不可用
客户端通过以下代码订阅:
stompClient.subscribe('/user/queue/bot', function (greeting) {
console.log(greeting);
});
如何从队列目的地获取消息?
我试图集思广益,并在 Spring 的 SimpMessagingTemplate 类中发现以下内容:
super.convertAndSend(this.destinationPrefix + user + destination, payload, headers, postProcessor);
这意味着,最终目的地是/user/[simpSessionId]/queue/bot还是 no ?
通过 VM -Dlogging.level.org.springframework=TRACE 登录
2020-02-14 18:42:46.281 TRACE 20460 --- [nio-8080-exec-7] o.s.w.s.m.StompSubProtocolHandler : From client: SUBSCRIBE /queue/test id=sub-0 session=d2cjojbp
2020-02-14 18:42:46.287 DEBUG 20460 --- [nboundChannel-5] o.s.m.s.b.SimpleBrokerMessageHandler : Processing SUBSCRIBE /queue/test id=sub-0 session=d2cjojbp
2020-02-14 18:42:47.509 TRACE 20460 --- [MessageBroker-1] o.s.m.s.u.UserDestinationMessageHandler : No active sessions for user destination: /user/d2cjojbp/queue/test