Как прослушать Quarkus Websocket, используя Angular 9? - PullRequest
0 голосов
/ 13 апреля 2020

Как следует из вопросов, я хочу создать сервис, который синхронизирует данные JSON между пользователями, используя Websocket. Но я совсем новичок в websockets, поэтому мне нужна ваша помощь.

Я использую следующие версии:

Внешний интерфейс: Angular: 9.1.0

Backend: Quarkus: 1.3.2.Final + Quarkus-undertow-websockets

У меня есть следующий код в Angular Сервисе:

import {Injectable} from '@angular/core';


@Injectable({
  providedIn: 'root',
})
export class SocketService {

  private ws: any;

  constructor() {
  }

  public connect(): void {

    this.ws = new WebSocket('ws://localhost:8080/sync/breit');

    this.ws.onmessage = (msg) => {
      console.log(msg);
    };
  }

  public sendData(data: any): void {
    this.ws.send('/' + name, {}, 'Testmessage');
  }
}

Функция connect вызывается в ngOninit() и sendData() при нажатии кнопки.

Теперь это код бэкэнда:

package io.sync.websocket;

import org.jboss.logging.Logger;

import javax.enterprise.context.ApplicationScoped;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@ServerEndpoint("/sync/{username}")
@ApplicationScoped
public class SyncSocket {

    private static final Logger LOG = Logger.getLogger(SyncSocket.class);
    Map<String, Session> sessions = new ConcurrentHashMap<>();

    @OnOpen
    public void onOpen(Session session, @PathParam("username") String username) {
        sessions.put(username, session);
    }

    @OnClose
    public void onClose(Session session, @PathParam("username") String username) {
        sessions.remove(username);
    }

    @OnError
    public void onError(Session session, @PathParam("username") String username, Throwable throwable) {
        sessions.remove(username);
        LOG.error("onError", throwable);
    }

    @OnMessage
    public void onMessage(String message, @PathParam("username") String username) {
        System.out.println("Message came through");
        broadcast(message);
    }

    private void broadcast(String message) {
        sessions.values().forEach(s -> {
            s.getAsyncRemote().sendObject(message, result -> {
                if (result.getException() != null) {
                    System.out.println("Unable to send message: " + result.getException());
                }
            });
        });
    }

}

У меня есть этот код из учебника по Quarkus Websocket. Просто немного его изменил.

Теперь, когда я нажимаю кнопку отправки, которая вызывает функцию sendData() в Сервисе, я ожидаю получить Testmessage, но я просто получаю /:

Вывод в веб-консоли:

Output in Webconsole

Я не знаю, как добавить дополнительный URL-адрес "слушателя" в Quarkus, я могу просто определить ServerEndpoint. При загрузке Spring это будет аннотация @SendTo('URL_COMES_HERE'). Существует ли что-то подобное в Quarkus?

1 Ответ

0 голосов
/ 13 апреля 2020

Пожалуйста, проверьте ваш метод sendData. Я думаю, что поведение данных "/" ожидается. Откуда происходит «имя»? в данный момент это просто кажется пустой строкой. Также, что касается «Testmessage»: если вы проверите метод Websocket.send , вы обнаружите, что в методе есть только один параметр; поэтому параметр «Testmessage» будет игнорироваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...