WebSocket not being triggered from outside its class

Discussão em 'Angular' iniciado por Jesús Mariscal, Novembro 17, 2024.

  1. I am using a Spring Backend with a Angular+Ionic frontend. I have created a WebSocket to trigger my frontend when a Teacher modifies a Grade in Moodle. This is irrelevant, just to give you some context.

    So the problem is that mi fronted is correctly subscribed:

    constructor(private apiUserService: ApiUserService) {
    this.webSocket = new WebSocket('ws://localhost:8080/newGrade');
    this.webSocket.onmessage = (event) => {
    console.log(event.data)
    }}


    And it gets the first message correctly. The problem is that when I update my DB and calls the Handler to be triggered it doesn't respond. I know that the method and my plugin in Moodle is working because the DB is UPDATED:

    @Autowired
    private NewGradeHandler newGradeHandler;

    private final ObjectMapper objectMapper = new ObjectMapper();

    @PostMapping("/updateGrade")
    public ResponseEntity<String> miEndpoint(@RequestBody Map<String, Object> datos) throws Exception {
    try {
    // Obtener los datos de la solicitud
    Long userId = Long.parseLong(datos.get("userid").toString());
    if (userId != -1) {
    Long courseId = Long.parseLong(datos.get("courseid").toString());
    int mark = Integer.parseInt(datos.get("grade").toString());
    String assignmentName = datos.get("assignmentname").toString();

    // Buscar el usuario y la asignatura
    User student = userService.findById(userId);
    Subject subject = subjectService.getSubject(courseId);

    // Crear una nueva nota o actualizarla si existe
    if (!subjectMarkService.existsByStudentIdAndSubjectIdAndNameMark(student, subject, assignmentName)) {
    Subject_Mark newMark = new Subject_Mark(student, subject, mark, "Ordinaria", assignmentName);
    subjectMarkService.save(newMark);
    Subject_Mark updatedGrade = subjectMarkService.getLastSubjectMarkAdded();
    sendMessageToWebSocket(updatedGrade);
    } else {
    updateExistingMark(student, subject, mark, assignmentName);
    }

    return ResponseEntity.ok("Nota creada/actualizada correctamente");
    }
    return ResponseEntity.ok("ok");
    } catch (NumberFormatException e) {
    return ResponseEntity.badRequest().body("Error al convertir los datos");
    } catch (RuntimeException e) {
    return ResponseEntity.badRequest().body(e.getMessage());
    }
    }

    private void updateExistingMark(User student, Subject subject, int mark, String assignmentName) throws Exception {
    Subject_Mark existingMark = subjectMarkService.findByStudentIdAndSubjectIdAndNameMark(student, subject, assignmentName).get();
    existingMark.setMark(mark);
    subjectMarkService.save(existingMark);
    }

    private void sendMessageToWebSocket(Subject_Mark grade) throws Exception {
    TextMessage message = new TextMessage(objectMapper.writeValueAsString(grade));
    for (WebSocketSession session : newGradeHandler.getSessions()) {
    session.sendMessage(message);
    }


    }

    My handler and its config is:

    @Configuration@EnableWebSocketpublic class WebSocketConfig implements WebSocketConfigurer {
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
    registry.addHandler(new NewGradeHandler(), "/newGrade").setAllowedOrigins("*");
    }

    @Bean
    public WebSocketHandler NewGradeHandler() {
    return new NewGradeHandler();
    }}


    And this is my Handler:

    @Componentpublic class NewGradeHandler extends TextWebSocketHandler {
    private final ObjectMapper objectMapper = new ObjectMapper();
    private final List<WebSocketSession> sessions = new CopyOnWriteArrayList<>();
    @Autowired
    private SubjectMarkService subjectMarkService;

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {

    Subject_Mark newGrade = subjectMarkService.getLastSubjectMarkAdded();

    TextMessage message = new TextMessage(objectMapper.writeValueAsString(newGrade));
    session.sendMessage(message);
    sessions.add(session);
    }

    public List<WebSocketSession> getSessions() {
    return sessions;
    }}


    I have searched some guides but the update the wbesocket from inside the class which I know it works: https://medium.com/@parthiban.rajal...ts-using-spring-boot-and-angular-b11e7363f051

    I would appreciate some help.

    Continue reading...

Compartilhe esta Página