I just want to test if convertAndSendToUser
is working or not. If you have the same problem or experience please help me to fix it.
You can see the method when I use the code upder it it same to ok(convertAndSend
). When I use convertAndSendToUser
my html can not get the STOMP message. So I guess destination is right,but something wrong I can‘t found;
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Resource
private WebSocketHandshakeInterceptor webSocketHandshakeInterceptor;
@Autowired
private WebSocketService webSocketService;
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint(PathConstant.STOMP_CHAT_CHANNEL).addInterceptors(webSocketHandshakeInterceptor).setAllowedOrigins("*").withSockJS(); registry.addEndpoint(PathConstant.STOMP_CLASS_COMMEND).setAllowedOrigins("*").withSockJS().setInterceptors(webSocketHandshakeInterceptor);
// test
registry.addEndpoint("/ws").setAllowedOrigins("*").withSockJS().setInterceptors(webSocketHandshakeInterceptor);
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker(PathConstant.TOPIC, PathConstant.USER);
registry.setApplicationDestinationPrefixes(PathConstant.APP);
}
@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
registration.interceptors(new ChannelInterceptor() {
@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
if (StompCommand.CONNECT.equals(accessor.getCommand())) {
String token = accessor.getFirstNativeHeader("Auth_token");
String username = webSocketService.checkToken(token).getUser_name();
String uid = UUID.randomUUID().toString().replace("-", "");
SocketUser user = new SocketUser(uid,username);
accessor.setUser(user);
webSocketService.addSocketCache(uid, user);
}
return message;
}
});
}
}
public class SocketUser implements Principal, Serializable {
private static final long serialVersionUID = -2882674220040446492L;
private final String username;
private final String userId;
public SocketUser(String userId,String username) {
this.userId = userId;
this.username = username;
}
public static long getSerialVersionUID() {
return serialVersionUID;
}
public String getUsername() {
return username;
}
public String getUserId() {
return userId;
}
@Override
public String getName() {
return userId;
}
}
@RestController
public class ChatroomController {
private final Logger logger = LoggerFactory.getLogger(ChatroomController.class);
@Autowired
private MessageService messageService;
@Autowired
private Gson gson;
@Autowired
ChatroomMessageRepository chatroomMessageRepository;
@Autowired
ChatroomUserRepository chatroomUserRepository;
@Autowired
private SimpMessageSendingOperations messagingTemplate;
// @Autowired
// private SimpMessagingTemplate messagingTemplate;
@Autowired
private SimpUserRegistry userRegistry;
@Autowired
WebSocketService webSocketService;
@MessageMapping(PathConstant.STOMP_CHAT_ADD_USER)
@SendTo(PathConstant.TOPIC_PUBLIC)
public ChatMessage addUser(@Payload ChatMessage chatMessage, StompHeaderAccessor accessor) {
userRegistry.getUsers().stream().forEach(System.out::println);
accessor.getSessionAttributes().put("username", chatMessage.getSender());
chatMessage.setUid(accessor.getUser().getName());
return chatMessage;
}
@MessageMapping(PathConstant.STOMP_CHAT_ADD_MESSAGE)
@SendTo(PathConstant.TOPIC_PUBLIC)
public ChatMessage addMessage(@Payload ChatMessage chatMessage, StompHeaderAccessor accessor) {
return chatMessage;
}
@MessageMapping(PathConstant.USER_CHAT)
public void sendToUser(@Payload ChatMessage chatMessage, StompHeaderAccessor accessor) {
String uid = accessor.getUser().getName();
chatMessage.setType(ChatMessage.MessageType.CHAT);
System.out.println("/user/" + uid + "/chat");
messagingTemplate.convertAndSendToUser(uid, "/user/" + uid + "/chat", chatMessage);
// messagingTemplate.convertAndSend("/user/" + uid + "/chat" , chatMessage);
}
}
super.convertAndSend(this.destinationPrefix + user + destination, payload, headers, postProcessor); private String destinationPrefix = "/user/"; spring-message already put your uid and "user" in your destination , so you can use like this " messagingTemplate.convertAndSendToUser(uid, "/chat" , chatMessage)"