简体   繁体   English

Spring 引导的 convertAndSendToUser 不工作

[英]Spring boot's convertAndSendToUser not working

I'm new to Spring boot and trying to learn it.我是 Spring 引导的新手并试图学习它。 I'm following a tutorial on how to make a simple one-to-one chat app.我正在学习如何制作一个简单的一对一聊天应用程序的教程

Everything is working fine except that messages aren't getting sent between users.除了没有在用户之间发送消息外,一切正常。 Messages get from the sender to the server but when convertAndSentToUser() nothing gets to the other client (recipient).消息从发送者发送到服务器,但是当convertAndSentToUser()没有任何东西到达其他客户端(接收者)。

Here's the message broker configuration:这是消息代理配置:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketMessageBrokerConfig implements WebSocketMessageBrokerConfigurer {
    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/user");
        config.enableSimpleBroker("/topic", "/queue");
        config.setApplicationDestinationPrefixes("/app");
        config.setUserDestinationPrefix("/user");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/broadcast");
        registry.addEndpoint("/broadcast").withSockJS().setHeartbeatTime(60_000);
        registry.addEndpoint("/chat").withSockJS();
    }

    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
        registration.interceptors(new UserInterceptor());
    }
}

And the controller that handles new connections:以及处理新连接的 controller:

@RestController
@Log4j2
public class WebSocketConnectionRestController {
    
    @Autowired
    private ActiveUserManager activeSessionManager;
    
    ...

    @PostMapping("/rest/user-connect")
    public String userConnect(HttpServletRequest request, @ModelAttribute("username") String userName) {
        String remoteAddr = "";
        if (request != null) {
            remoteAddr = request.getHeader("Remote_Addr");
            if (remoteAddr == null || remoteAddr.isEmpty()) {
                remoteAddr = request.getHeader("X-FORWARDED-FOR");
                if (remoteAddr == null || "".equals(remoteAddr)) {
                    remoteAddr = request.getRemoteAddr();
                }
            }
        }

        log.info("registered " + userName + " " + remoteAddr);
        activeSessionManager.add(userName, remoteAddr);
        return remoteAddr;
    }


   ...

}

Finally, here's the controller that handles new messages:最后,这是处理新消息的 controller:

@Controller
@Log4j2
public class WebSocketChatController implements ActiveUserChangeListener {
    @Autowired
    private SimpMessagingTemplate webSocket;

    ...
    
    @MessageMapping("/chat")
    public void send(@Payload ChatMessage chatMessage) throws Exception {
        ChatMessage message = new ChatMessage(chatMessage.getFrom(), chatMessage.getText(), chatMessage.getRecipient());
        log.info("sent message to " + chatMessage.getRecipient());
        webSocket.convertAndSendToUser(chatMessage.getRecipient(), "/queue/messages", message);
    }

    ...

}

I finally found the problem.我终于找到了问题所在。 The tutorial had a UserInterceptor which links the session id for new connections to the username but it was trying to cast an Arraylist to a LinkedList so I just casted it to a List instead:本教程有一个UserInterceptor ,它将 session id 链接到用户名的新连接,但它试图将 Arraylist 转换为 LinkedList 所以我只是将它转换为 List :

public class UserInterceptor implements ChannelInterceptor {
    
    @Override
    public Message<?> preSend(Message<?> message, MessageChannel channel) {
        StompHeaderAccessor accessor
                = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);

        if (StompCommand.CONNECT.equals(accessor.getCommand())) {

            Object raw = message
                    .getHeaders()
                    .get(SimpMessageHeaderAccessor.NATIVE_HEADERS);

            if (raw instanceof Map) {
                Object name = ((Map) raw).get("username");
                if (name instanceof List) {
                    accessor.setUser(new User(((List) name).get(0).toString()));
                }
            }
        }

        return message;
    }
}

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

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