Използване на WebSocket за създаване на интерактивни уеб приложения, Пролет български!
Този урок обхваща процеса на създаване на приложение „здравей свят“, което изпраща съобщения напред и назад между сървъра и браузъра. WebSocket е много тънък и лек слой над TCP. Това го прави много подходящ за използване на "подпротоколи" за вмъкване на съобщения. В този урок ще научим и ще използваме STOMP съобщения с помощта на Spring за създаване на интерактивно уеб приложение.
Какво ще създадете
Ще създадете сървър, който ще приеме съобщение, съдържащо потребителско име. В отговор той ще изпрати hello на опашката, за която клиентът е абониран.
От какво имаш нужда
Как да вземете този урок
Както повечето пролетни уроци, можете да започнете от нулата и да следвате всяка стъпка или да пропуснете основните стъпки, които вече знаете. Така или иначе ще получите работещ код.
За дазапочнете от нулата, отидете на Настройка на проекта.
За дапропуснете основните стъпки, направете следното:
- Изтеглете и разархивирайте архива с кода на този урок или клонирайте от хранилището с помощта на Git: git clone https://github.com/spring-guides/gs-messaging-stomp-websocket.git
- Отидете в директорията gs-messaging-stomp-websocket/initial
- Продължавайки напред, създайте клас за представяне на ресурси
Когато сте готови, можете да сравните резултата с извадката в gs-messaging-stomp-websocket/complete.
Настройка на проекта
Първо трябва да настроите основен скрипт за изграждане. Можете да използвате всяка система за изграждане, която желаете, за изграждане на Spring проекти, но в този урок ще разгледаме кода за работа с Gradle и Maven. Ако неАко сте запознати с някой от тях, вижте свързаните уроци Изграждане на Java проект с помощта на Gradle или Изграждане на Java проект с помощта на Maven.
Създайте структура на директория
В директорията на проекта по ваш избор създайте следната структура на директория; например с mkdir -p src/main/java/hello за *nix системи:
Създаване на файл за изграждане на Gradle
По-долу е първоначалният файл за изграждане на Gradle. Файлът pom.xml се намира тук. Ако използвате Spring Tool Suite (STS), можете да импортирате урока директно от него.
Плъгинът Spring Boot gradle предоставя много удобни функции:
- Той събира всички буркани в classpath и събира един изпълним файл "?ber-jar", което улеснява изпълнението и предоставянето на вашата услуга
- Той търси публичен статичен void main() метод като знак за изпълним клас
- Той осигурява вградено разрешаване на зависимости с конкретни номера на версиите за съответните зависимости на Spring Boot. Можете да замените каквито и да са версии, но по подразбиране ще се зареди с избрания набор от версии
Създайте клас за преглед на ресурси
Сега, след като сте настроили проекта си, можете да създадете своята услуга за съобщения STOMP.
Нека започнем с процеса на взаимодействие с услугата.
Услугата ще приема съобщения, съдържащи името STOMP, чиито тела са обекти в JSON:
За да симулирате съобщение, съдържащо име, можете да създадете POJO с поле за име и съответния метод getName():
След получаване на съобщението и извличане на името, услугата ще създаде поздрав въз основа на него и ще го публикува в отделна опашка, за която клиентът е абониран. Поздравът също ще бъде под формата на JSON обект, който изглежда такатака:
За да моделирате изгледа за добре дошли, добавяте друг POJO с поле за съдържание и съответния метод getContent():
Spring ще използва JSON библиотеката на Jackson за автоматично обвиване на екземпляри от типа Greeting в JSON.
След това ще създадете контролер за получаване на поздравително съобщение и изпращане на поздравително съобщение.
Създаване на контролер за обработка на съобщения
В подхода на Spring за работа със STOMP съобщения, STOMP съобщенията могат да бъдат насочени към @Controller класове. Например GreetingController обработва съобщения за /hello.
контролерът е кратък и прост, но има много неща. Нека разгледаме по-отблизо стъпка по стъпка.
Анотацията @MessageMapping гарантира, че ако се изпрати съобщение до /hello, тогава ще бъде извикан методът greeting().
Полезната част от съобщението е обвързана с обекта HelloMessage, който се предава на greeting().
Вътре в реализацията на метода се симулира обработка на съобщения, спирайки нишката на изпълнение за три секунди. Това показва, че след като клиентът изпрати съобщението, на сървъра ще отнеме произволно дълго време, за да обработи съобщението асинхронно. Клиентът може да продължи работата си, без да се налага да чака отговор.
След забавяне от три секунди методът greeting() създава обект Greeting и го връща. Върнатата стойност се изпраща до всички абонати на /topic/greetings, както е дефинирано в анотацията @sendTo.
Настройване на Spring за STOMP съобщения
Сега, когато основните сервизни компоненти са налице, можете да конфигурирате Spring да активира WEbSocket и STOMP съобщения.
Създайте Java WebSocketConfig клас, както е показано по-долу:
WebSocketConfig е анотиран с @Configuration,което означава, че е пролетен конфигурационен клас. Той също така е анотиран с @EnableWebSocketMessageBroker. Както подсказва името му, @EnableWebSocketMessageBroker позволява обработка на съобщения през WebSocket, върнат от брокера на съобщения.
Методът configureMessageBroker() заменя поведението по подразбиране в WebSocketMessageBrokerConfigurer, за да конфигурира брокера на съобщения. Той извиква enableSimpleBroker(), за да позволи на обикновен брокер на съобщения в паметта да връща съобщения обратно към клиента на дестинации с префикс /topic. Той също така декларира префикс /app за съобщения, обвързани с методи, анотирани с @MessageMapping.
Методът registerStompEndpoints() регистрира /hello, като по избор включва SockJS като алтернативна опция за съобщения, когато WebSocket не е наличен.
Изграждане на клиент за браузър
Страната на сървъра е на мястото си, сега нека насочим вниманието си към Javascript клиента, който ще изпраща съобщения до и ще получава от сървъра. Създайте index.html като по-долу:
Функцията connect() използва SockJS и stomp.js, за да отвори връзка към /gs-messaging-stomp-websocket/hello, където GreetingController чака връзки. След успешна връзка, той се абонира за /topic/greetings, където сървърът публикува поздравителни съобщения. Когато съобщението бъде получено, функцията ще добави елемент на параграф към DOM, за да покаже приветстващото съобщение.
Функцията sendName() приема името, въведено от потребителя, и се използва от STOMP клиента, за да го изпрати до /app/hello (и GreetingController.greeting() ще го получи).
Направете приложението изпълнимо
Въпреки че този сервизен пакет може да бъде в уеб приложение и WAR файлове, по-простият подход, показан по-долу, създавасамостоятелно приложение. Вие пакетирате всичко в един изпълним JAR файл, който работи през познатия стар Java main() метод. По пътя вие използвате поддръжката на Spring за вградения контейнер на сървлети Tomcat като HTTP среда за изпълнение, вместо да разгръщате в екземпляр на трета страна.
Методът main() предава контрола на помощния клас SpringApplication, предоставяйки Application.class като аргумент на неговия метод run(). Това казва на Spring да прочете анотацията за метаданни от приложението и да го управлява като bean в контекста на приложението Spring.
Анотацията @ComponentScan казва на Spring да изпълни рекурсивно търсене на пакета hello и дъщерните класове, анотирани директно или индиректно от Spring с анотацията @Component. Това гарантира, че Spring намира и регистрира GreetingController, тъй като той е маркиран с @Controller, което от своя страна е вид @Component анотация.
Анотацията @EnableAutoConfiguration превключва наличните настройки по подразбиране въз основа на съдържанието на вашия клас път. Например, защото Тъй като приложението зависи от вградената версия на Tomcat (tomcat-embed-core.jar), сървърът Tomcat се инсталира и конфигурира по подразбиране от ваше име. И също така, защото приложението зависи от Spring MVC (spring-webmvc.jar), Spring MVC DispatcherServlet е конфигуриран и регистриран за вас - не е необходим web.xml! Така че тук е MultipartConfigElement, той е конфигуриран от DispatcherServlet с функционалност за качване на файлове. Автонастройката е мощен и гъвкав механизъм. Повече подробности можете да намерите в документацията на API.
Изграждане на изпълним JAR
Можете да създадете един изпълним JAR файл, който съдържа всички необходими зависимости, класове и ресурси. Това го прави лесен за изтегляневерсия и внедряване на услугата като приложение през целия период на разработка, в различни среди и т.н.
След това можете да стартирате JAR файла:
Ако използвате Maven, можете да стартирате приложението с помощта на mvn spring-boot:run или можете да изградите приложението с mvn чист пакет и да стартирате JAR така:
Ако използвате Gradle, можете да стартирате услугата си от командния ред:
Като алтернатива можете да стартирате услугата си директно от Gradle така:
Услугата трябва да започне да работи след няколко секунди.
Тестване на услугата
след отваряне на връзката ще бъдете помолени да въведете вашето име. Въведете го и щракнете върху бутона "Изпрати". Вашето име ще бъде изпратено до сървъра като JSON съобщение през STOMP. След забавяне от 3 секунди сървърът ще изпрати обратно съобщение „Здравей“, което да се покаже на страницата. В този момент можете да изпратите различно име или да щракнете върху бутона „Прекъсване“, за да затворите връзката.
Честито! Току-що разработихте услуга за съобщения STOMP с помощта на Spring.