Spring 中的 STOMP 通知未在控制台中返回消息

问题描述 投票:0回答:1

所以我一直在尝试为我的应用程序编写简单的通知,但遇到了以下问题。我能够连接 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>

有人能解决吗?

java spring websocket push-notification stomp
1个回答
0
投票

目前在您发布的示例中,没有自动向

/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);
    });
© www.soinside.com 2019 - 2024. All rights reserved.