Я прочитал эту документацию -> websockets-next и справочное руководство websockets-next.
Я понимаю, как можно реализовать сообщение чата, потому что клиент реагирует на конечные точки, но я понятия не имею, как сервер может отправлять сообщения клиентам, если на сервере происходят обновления. Во-вторых, как я могу отправлять не только текстовые сообщения, но и целые DTO?
Я никогда не работал с сокетами, поэтому знаю только REST-Endpoints. Мой пример кода:
ДТО для клиентов:
@Data
public class InformationForClientDTO {
private List<FinancialCalculationsDTO> list;
private int version;
}
Код на сервере:
@ApplicationScoped
public class ServerCode {
public void someCalculation(){
//Server has reached some point which is important for clients. Send listForClients to all connected clients:
Arraylist<InformationForClientDTO> listForClients;
//How to send this list to the clients? How can I call the websocket with all clients and send them the DTOs?
}
}
Пример кода Из вики Quarkus:
@WebSocket(path = "/chat/{username}")
public class ChatWebSocket {
// Declare the type of messages that can be sent and received
public enum MessageType {USER_JOINED, USER_LEFT, CHAT_MESSAGE}
public record ChatMessage(MessageType type, String from, String message) {
}
@Inject
WebSocketConnection connection;
@OnOpen(broadcast = true)
public ChatMessage onOpen() {
return new ChatMessage(MessageType.USER_JOINED, connection.pathParam("username"), null);
}
@OnClose
public void onClose() {
ChatMessage departure = new ChatMessage(MessageType.USER_LEFT, connection.pathParam("username"), null);
connection.broadcast().sendTextAndAwait(departure);
}
@OnTextMessage(broadcast = true)
public ChatMessage onMessage(ChatMessage message) {
return message;
}
}
//РЕДАКТИРОВАТЬ Для тех, кто ищет дополнительную информацию о веб-сокетах-далее, я нашел это: Обсуждение веб-сокетов дальше
но я понятия не имею, как сервер может отправлять сообщения клиентам, если на сервере происходят обновления.
Вы можете ввести io.quarkus.websockets.next.OpenConnections
, который обеспечит удобный доступ ко всем открытым соединениям. Обратите внимание, что эта функция еще не задокументирована, но существует открытая проблема.
Во-вторых, как я могу отправлять не только текстовые сообщения, но и целые DTO?
В вашем случае вы отправляете не простое текстовое сообщение, а запись Java, которая по умолчанию преобразуется в JSON. Следующая попытка WS закодировать/декодировать любой POJO с помощью Джексона. Поэтому, если ваш DTO соответствует требованиям Джексона, он преобразуется автоматически. Вы также можете предоставить собственный кодек — см. https://quarkus.io/guides/websockets-next-reference#serialization-and-deserialization.