Quarkus websockets-next Отправка сообщений клиентам

Я прочитал эту документацию -> 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;
    }

}

//РЕДАКТИРОВАТЬ Для тех, кто ищет дополнительную информацию о веб-сокетах-далее, я нашел это: Обсуждение веб-сокетов дальше

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
130
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

но я понятия не имею, как сервер может отправлять сообщения клиентам, если на сервере происходят обновления.

Вы можете ввести io.quarkus.websockets.next.OpenConnections, который обеспечит удобный доступ ко всем открытым соединениям. Обратите внимание, что эта функция еще не задокументирована, но существует открытая проблема.

Во-вторых, как я могу отправлять не только текстовые сообщения, но и целые DTO?

В вашем случае вы отправляете не простое текстовое сообщение, а запись Java, которая по умолчанию преобразуется в JSON. Следующая попытка WS закодировать/декодировать любой POJO с помощью Джексона. Поэтому, если ваш DTO соответствует требованиям Джексона, он преобразуется автоматически. Вы также можете предоставить собственный кодек — см. https://quarkus.io/guides/websockets-next-reference#serialization-and-deserialization.

Другие вопросы по теме