Stomp 客户端没有收到关于用户目的地的消息?
Stomp client doesn't receive message on user destination?
我遇到了一个问题,即客户端没有收到发送到用户目的地的 stomp 消息。让我解释一下:
在 WebSocketMessageBrokerConfigurer 中:
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/secured/topic", "/secured/user/queue");
config.setUserDestinationPrefix("/secured/user");
..
在我的 stompjs 客户端上(以“管理员”身份登录):
stompClient.subscribe('/secured/user/queue/notifications'
, function (output) {
console.log(output);
});
在日志中:
Processing SUBSCRIBE /secured/user/queue/notifications id=sub-0 session=d74f49b3-bb63-580f-b862-81647cc712b3
和java发送消息的代码:
simpMessagingTemplate.convertAndSendToUser(
"admin", "/secured/user/queue/notifications", out);
日志中的结果:
Processing MESSAGE destination=/secured/user/queue/notifications-userd74f49b3-bb63-580f-b862-81647cc712b3 session=null payload={"from":"server","text":"hello","recipient":"admin","time":"13:29:10"}
-
但是控制台日志中没有打印任何消息。
如您所见,订阅和发送步骤中的 sessionid 是相同的。但我不明白为什么客户没有收到消息。请注意,没有用户目的地的消息工作正常。
有人可以帮我吗?
也许您应该创建自己的用户主体模型 class 以确定它具有像这样的正确用户名。
public class StompPrincipal implements Principal {
String name;
String userid;
public StompPrincipal(String name) {
this.name = name;
}
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
@Override
public String getName() {
return name;
}
}
您还应该创建一个 DefaultHandshakeHandler
实现来使用您选择的名称创建用户。
public class CustomHandshakeHandler extends DefaultHandshakeHandler {
// Custom class for storing principal
@Override
protected Principal determineUser(ServerHttpRequest request,
WebSocketHandler wsHandler,
Map<String, Object> attributes) {
// Generate principal with UUID as name
return new StompPrincipal(UUID.randomUUID().toString());
}
}
最后将 CustomHandshakeHandler
class 添加到 setHandshakeHandler
方法中,如下所示
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws")
.setAllowedOrigins("*")
.setHandshakeHandler(new CustomHandshakeHandler());
}
我尝试了很多变体,但我不确定它为什么起作用,但我没有抱怨。我做了什么:
在 configureMessageBroker (WebSocketMessageBrokerConfigurer) 中(这真的让我感到困惑,这与我阅读的所有样本背道而驰):
config.enableSimpleBroker("/secured/topic", "/secured/queue", "/secured/user");
convertAndSendToUser(“/secured/user”+用户名由convertAndSendToUser添加):
simpMessagingTemplate.convertAndSendToUser( "admin", "/queue/notifications", out);
我在客户端订阅(对在这里添加用户名不是很满意..):
stompClient.subscribe("/secured/user/"+userName+"/queue/notifications"
, function (output) {
但它有效 ;-)
[编辑]
跟踪日志记录可以更轻松地了解正在发生的事情:
<Logger name="org.springframework.messaging" level="trace" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
我遇到了一个问题,即客户端没有收到发送到用户目的地的 stomp 消息。让我解释一下:
在 WebSocketMessageBrokerConfigurer 中:
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/secured/topic", "/secured/user/queue");
config.setUserDestinationPrefix("/secured/user");
..
在我的 stompjs 客户端上(以“管理员”身份登录):
stompClient.subscribe('/secured/user/queue/notifications'
, function (output) {
console.log(output);
});
在日志中:
Processing SUBSCRIBE /secured/user/queue/notifications id=sub-0 session=d74f49b3-bb63-580f-b862-81647cc712b3
和java发送消息的代码:
simpMessagingTemplate.convertAndSendToUser(
"admin", "/secured/user/queue/notifications", out);
日志中的结果:
Processing MESSAGE destination=/secured/user/queue/notifications-userd74f49b3-bb63-580f-b862-81647cc712b3 session=null payload={"from":"server","text":"hello","recipient":"admin","time":"13:29:10"}
-
但是控制台日志中没有打印任何消息。
如您所见,订阅和发送步骤中的 sessionid 是相同的。但我不明白为什么客户没有收到消息。请注意,没有用户目的地的消息工作正常。
有人可以帮我吗?
也许您应该创建自己的用户主体模型 class 以确定它具有像这样的正确用户名。
public class StompPrincipal implements Principal {
String name;
String userid;
public StompPrincipal(String name) {
this.name = name;
}
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
@Override
public String getName() {
return name;
}
}
您还应该创建一个 DefaultHandshakeHandler
实现来使用您选择的名称创建用户。
public class CustomHandshakeHandler extends DefaultHandshakeHandler {
// Custom class for storing principal
@Override
protected Principal determineUser(ServerHttpRequest request,
WebSocketHandler wsHandler,
Map<String, Object> attributes) {
// Generate principal with UUID as name
return new StompPrincipal(UUID.randomUUID().toString());
}
}
最后将 CustomHandshakeHandler
class 添加到 setHandshakeHandler
方法中,如下所示
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws")
.setAllowedOrigins("*")
.setHandshakeHandler(new CustomHandshakeHandler());
}
我尝试了很多变体,但我不确定它为什么起作用,但我没有抱怨。我做了什么:
在 configureMessageBroker (WebSocketMessageBrokerConfigurer) 中(这真的让我感到困惑,这与我阅读的所有样本背道而驰):
config.enableSimpleBroker("/secured/topic", "/secured/queue", "/secured/user");
convertAndSendToUser(“/secured/user”+用户名由convertAndSendToUser添加):
simpMessagingTemplate.convertAndSendToUser( "admin", "/queue/notifications", out);
我在客户端订阅(对在这里添加用户名不是很满意..):
stompClient.subscribe("/secured/user/"+userName+"/queue/notifications"
, function (output) {
但它有效 ;-)
[编辑] 跟踪日志记录可以更轻松地了解正在发生的事情:
<Logger name="org.springframework.messaging" level="trace" additivity="false">
<AppenderRef ref="Console"/>
</Logger>