1. Обзор
В этой статье мы создадим простое веб-приложение, которое реализует обмен сообщениями с использованием новых возможностей WebSocket , представленных в Spring Framework 4.0.
WebSockets-это двунаправленное , полнодуплексное , постоянное соединение между веб-браузером и сервером. После установления соединения WebSocket соединение остается открытым до тех пор, пока клиент или сервер не решит закрыть это соединение.
Типичным примером использования может быть, когда приложение включает в себя несколько пользователей, общающихся друг с другом, например, в чате. В нашем примере мы построим простой чат-клиент.
2. Зависимости Maven
Поскольку это проект на основе Maven, мы сначала добавим необходимые зависимости в pom.xml :
org.springframework spring-websocket 5.2.2.RELEASE org.springframework spring-messaging 5.2.2.RELEASE
Кроме того, поскольку мы будем использовать JSON для создания тела наших сообщений, нам нужно добавить зависимости Jackson . Это позволяет Spring преобразовать наш объект Java в/из JSON :
com.fasterxml.jackson.core jackson-core 2.10.2 com.fasterxml.jackson.core jackson-databind 2.10.2
Если вы хотите получить самую новую версию библиотек выше, поищите их в Maven Central .
3. Включите WebSocket весной
Первое, что нужно сделать, это включить возможности WebSocket. Для этого нам нужно добавить конфигурацию в наше приложение и аннотировать этот класс с помощью @EnableWebSocketMessageBroker .
Как следует из его названия, он позволяет обрабатывать сообщения WebSocket при поддержке брокера сообщений:
@Configuration @EnableWebSocketMessageBroker public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry config) { config.enableSimpleBroker("/topic"); config.setApplicationDestinationPrefixes("/app"); } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/chat"); registry.addEndpoint("/chat").withSockJS(); } }
Здесь мы видим, что метод configureMessageBroker используется для настройки брокера сообщений . Во-первых, мы позволяем брокеру сообщений в памяти передавать сообщения обратно клиенту по назначениям с префиксом “/topic”.
W e завершите нашу простую конфигурацию, указав префикс “/app” для фильтрации назначений, ориентированных на аннотированные методы приложения (через @MessageMapping ).
Метод registerStompEndpoints регистрирует конечную точку “/chat”, включая Spring STOMP support . Имейте в виду, что мы также добавляем сюда конечную точку, которая работает без SockJS для обеспечения эластичности.
Эта конечная точка с префиксом “/app” является конечной точкой, для обработки которой сопоставлен метод Chat Controller.send () .
Он также включает SockJS резервные опции, чтобы можно было использовать альтернативные варианты обмена сообщениями, если веб-сайты недоступны. Это полезно, так как WebSocket еще не поддерживается во всех браузерах и может быть исключен ограничительными сетевыми прокси-серверами.
Резервные варианты позволяют приложениям использовать API WebSocket, но при необходимости во время выполнения изящно деградируют до альтернатив, отличных от WebSocket.
4. Создайте модель сообщения
Теперь, когда мы настроили проект и настроили возможности WebSocket, нам нужно создать сообщение для отправки.
Конечная точка будет принимать сообщения, содержащие имя отправителя и текст в сообщении STOMP, тело которого является объектом JSON .
Сообщение может выглядеть следующим образом:
{ "from": "John", "text": "Hello!" }
Чтобы смоделировать сообщение, несущее текст, мы можем создать простой объект Java со свойствами from и text :
public class Message { private String from; private String text; // getters and setters }
По умолчанию Spring будет использовать библиотеку Jackson для преобразования нашего объекта модели в JSON и из него.
5. Создайте контроллер обработки сообщений
Как мы уже видели, подход Spring к работе с сообщениями STOMP заключается в том, чтобы связать метод контроллера с настроенной конечной точкой. Это стало возможным благодаря аннотации @MessageMapping .
Связь между конечной точкой и контроллером дает нам возможность обрабатывать сообщение при необходимости:
@MessageMapping("/chat") @SendTo("/topic/messages") public OutputMessage send(Message message) throws Exception { String time = new SimpleDateFormat("HH:mm").format(new Date()); return new OutputMessage(message.getFrom(), message.getText(), time); }
Для или целей | нашего примера мы создадим другой объект модели с именем Выходное сообщение для представления выходного сообщения, отправленного в настроенное место назначения . Мы заполняем наш объект отправителем и текстом сообщения, взятым из входящего сообщения, и обогащаем его меткой времени.
После обработки нашего сообщения мы отправляем его в соответствующее место назначения, определенное с помощью аннотации @SendTo . Все подписчики пункта назначения ” /тема/сообщения ” получат сообщение.
6. Создайте клиент браузера
После создания наших конфигураций на стороне сервера мы будем использовать sockjs-клиент библиотеку для создания простой HTML-страницы, которая взаимодействует с нашей системой обмена сообщениями.
Прежде всего, нам нужно импортировать клиентские библиотеки sockjs и stomp Javascript. Затем мы можем создать функцию connect() для открытия связи с нашей конечной точкой, функцию SendMessage() для отправки сообщения STOMP и функцию disconnect() для закрытия связи:
Chat WebSocket
7. Тестирование примера
Чтобы проверить наш пример, мы можем открыть несколько окон браузера и получить доступ к странице чата по адресу:
http://localhost:8080
Как только это будет сделано, мы сможем присоединиться к чату, введя ник и нажав кнопку подключения. Если мы составим и отправим сообщение, мы сможем увидеть его во всех сеансах браузера, которые присоединились к чату.
Взгляните на скриншот, чтобы увидеть пример:
8. Заключение
В этом уроке мы изучили Поддержку WebSocket Spring. Мы видели его конфигурацию на стороне сервера и построили простой клиентский аналог | с использованием библиотек sockjs и stomp Javascript.
Пример кода можно найти в проекте GitHub .