Как следует из вопросов, я хочу создать сервис, который синхронизирует данные 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](https://i.stack.imgur.com/WDw8S.png)
Я не знаю, как добавить дополнительный URL-адрес "слушателя" в Quarkus, я могу просто определить ServerEndpoint. При загрузке Spring это будет аннотация @SendTo('URL_COMES_HERE')
. Существует ли что-то подобное в Quarkus?