![](/img/trans.png)
[英]Logback and Spring Boot's new springProperty lookup mechanism not working
[英]Spring boot's convertAndSendToUser not working
我是 Spring 引導的新手並試圖學習它。 我正在學習如何制作一個簡單的一對一聊天應用程序的教程。
除了沒有在用戶之間發送消息外,一切正常。 消息從發送者發送到服務器,但是當convertAndSentToUser()
沒有任何東西到達其他客戶端(接收者)。
這是消息代理配置:
@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());
}
}
以及處理新連接的 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;
}
...
}
最后,這是處理新消息的 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);
}
...
}
我終於找到了問題所在。 本教程有一個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.