繁体   English   中英

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 是相同的。 但我不明白为什么客户没有收到消息。 请注意,没有用户目的地的消息工作正常。

任何人都可以向我伸出援助之手吗?

也许您应该创建自己的用户主体 model 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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM