stomp客户端在用户目标上没有收到消息?

cwxwcias  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(676)

我遇到的问题是客户端没有接收到发送到用户目的地的stomp消息。让我解释一下:
在WebSocketMessageBrokerConfigure中:

public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/secured/topic", "/secured/user/queue");
config.setUserDestinationPrefix("/secured/user");
..

在我的stompjs客户端(以“admin”登录):

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在subscribe和send步骤中是相同的。但我不明白为什么客户没有收到信息。请注意,没有用户目标的消息工作正常。
有人能帮我一把吗?

a9wyjsp7

a9wyjsp71#

我尝试了很多不同的方法,但我不知道为什么,但我没有抱怨。我所做的:
在configuremessagebroker(WebSocketMessageBrokerConfigure)中(这让我非常困惑,与我读到的所有示例都不符):

config.enableSimpleBroker("/secured/topic", "/secured/queue", "/secured/user");

convertandsendtouser(convertandsendtouser添加了“/secured/user”+用户名):

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>
nkkqxpd9

nkkqxpd92#

也许您应该创建自己的用户主体模型类来确定它是否有这样的正确用户名。

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 类到 setHandshakeHandler 方法如下

@Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {

        registry.addEndpoint("/ws")
                .setAllowedOrigins("*")
                .setHandshakeHandler(new CustomHandshakeHandler());
    }

相关问题