所以我一直在尝试为我的应用程序编写简单的通知,但遇到了以下问题。我能够连接 websocket,但它也应该在控制台中写入消息,但它没有。我前两天刚开始学习websockets和notification,所以不太明白应该怎么写才正确
我的配置:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/all","/specific");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws").setAllowedOriginPatterns("*").withSockJS();
}
}
控制器:
@RestController
public class MessageController {
@Autowired
private MessageService messageService;
@MessageMapping("/message")
// @SendTo("/all/messages")
public ResponseEntity<MessageResponse> sendMessageToAll(@RequestBody MessageRequest request) {
return ResponseEntity.ok(messageService.sendMessageToAll(request.getMessage()));
}
@MessageMapping("/message-user")
public ResponseEntity<MessageResponse> sendMessageToUser(@RequestBody MessageRequest request) {
return ResponseEntity.ok(messageService.sendMessageToUser(request.getUser(), request.getMessage()));
}
}
要求:
@Getter
public class MessageRequest {
String message = "mess";
User user;
}
回复:
public class MessageResponse{
String message;
}
消息模型:
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Message {
private String message = "mess";
private String recipient;
private boolean isRead;
@ManyToOne
private User user;
@Override
public String toString() {
return "Message{" +
"message='" + message + '\'' +
", recipient='" + recipient + '\'' +
'}';
}
}
服务及其实现:
public interface MessageService {
MessageResponse sendMessageToUser(User user, String message);
MessageResponse sendMessageToAll(String message);
}
@Service
public class MessageServiceImpl implements MessageService {
@Autowired
private SimpMessagingTemplate messagingTemplate;
@Override
public MessageResponse sendMessageToAll(String message) {
messagingTemplate.convertAndSend("/all/messages", "meessaaaa");
return new MessageResponse();
}
@Override
public MessageResponse sendMessageToUser(User user, String message) {
messagingTemplate.convertAndSendToUser(user.getUsername(), "/specific", message);
return new MessageResponse();
}
}
以防万一需要,这里是我用来检查代码的测试 html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>STOMP</title>
</head>
<body>
<h1>STOMP test</h1>
<script crossorigin="anonymous"
integrity="sha256-wS9gmOZBqsqWxgIVgA8Y9WcQOa7PgSIX+rPA0VL2rbQ="
src="https://code.jquery.com/jquery-1.9.1.min.js"></script>
<script crossorigin="anonymous"
integrity="sha512-iKDtgDyTHjAitUDdLljGhenhPwrbBfqTKWO1mkhSFH3A7blITC9MhYon6SjnMhp4o0rADGw9yAC6EW4t5a4K3g=="
src="https://cdnjs.cloudflare.com/ajax/libs/stomp.js/2.3.3/stomp.min.js"></script>
<script type="text/javascript">
let url = ('ws://localhost:8080/ws/websocket')
console.log(url)
stompClient = Stomp.client(url)
stompClient.connect({
}, function () {
stompClient.subscribe('/all/messages', function (output) {
console.log(JSON.parse(output.body))
});
}, function (err) {
alert('error' + err);
});
</script>
</body>
</html>
有人能解决吗?
目前在您发布的示例中,没有自动向
/all/messages
路径发送消息的逻辑,因此在建立 websocket 连接后控制台中不会打印任何内容。尝试向此路径发送一些消息,或者只需使用以下代码片段更新您的代码以发送一条虚拟消息,该消息又将消息发布到 /all/message
路径。
stompClient.connect({}, function () {
stompClient.subscribe('/all/messages', function (output) {
console.log(output.body);
});
stompClient.send("/app/message", {}, JSON.stringify({message: 'hello'}));
}, function (err) {
alert('error' + err);
});