Java EE 7中的WebSocket客户端API
在本文中,讓我們探索談?wù)撦^少的Web Socket Client API,以及如何在Java EE 7容器本身中利用它。
Web套接字服務(wù)器API規(guī)則
JSR 356的服務(wù)器端API(Java的Web套接字API)最常用于構(gòu)建Web套接字端點(diǎn)實(shí)現(xiàn)。 從客戶端的角度來看,基于JavaScriptHTML5(瀏覽器)客戶端經(jīng)常利用標(biāo)準(zhǔn)JavaScript Web套接字API,這些客戶端將自己附加到Web套接字服務(wù)器端點(diǎn),并享受雙向和全雙工通信。 您將看到常見的示例,例如實(shí)時(shí)地圖,股票行情自動收錄器,游戲,屏幕共享等應(yīng)用程序-所有這些用例都是Web套接字的完美選擇,而Java EE 7是構(gòu)建可擴(kuò)展Web套接字驅(qū)動的后端的理想平臺。
Web Socket客戶端API呢?
Web套接字規(guī)范還包括客戶端API,并且它對于所有JSR 356(例如Tyrus , Undertow等)實(shí)現(xiàn)都必須提供的API。 在相當(dāng)多的用例中, 可能不需要面向?yàn)g覽器/面向Web套接字客戶端的最終用戶。
例
考慮一種情況,您想連接到第三方Web Socket端點(diǎn),使用其信息并將其保留以備后用? 也許有待進(jìn)一步分析? 在這種情況下,利用Java EE容器本身內(nèi)的客戶端API很有用。
讓我們通過一個(gè)簡單的示例對此進(jìn)行探討。
(帶注釋)Web Socket Client
注意: @OnMessage的邏輯是有意排除的,并且已以不同的方式實(shí)現(xiàn)(稍后說明)
package blog.abhirockzz.wordpress.com;import javax.websocket.ClientEndpoint; import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.Session;@ClientEndpoint public class StockTickerClient {@OnClosepublic void closed(Session session) {System.out.println("Session " + session + " closed");}@OnErrorpublic void error(Throwable error) {System.out.println("Error: " + error.getMessage());}}股票代碼(信息)JPA實(shí)體
package blog.abhirockzz.wordpress.com;import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table;@Entity @Table(name = "STOCK_TICK") public class StockTick implements Serializable {@Id@GeneratedValue(strategy = GenerationType.AUTO)private Long id;private String name;private String price;public StockTick(String name, String price) {this.name = name;this.price = price;}public StockTick() {//for JPA}//getters and setters omitted ... }無狀態(tài)豆
- 處理股票行情信息的持久性
- 針對Java EE 7容器提供的默認(rèn)JDBC數(shù)據(jù)源執(zhí)行其操作( 約定優(yōu)于配置 !)
單例EJB
- 利用Web Socket ContainerProvider API
- 啟動與Web套接字服務(wù)器的連接
- 注入StockInfoPersistenceService bean并在addMessageHandler實(shí)現(xiàn)中使用它
如前所述,這里包含了(持久性)邏輯,該邏輯可以嵌入在StockTickerClient類的@OnMessage注釋方法中。 這是因?yàn)镾tockInfoPersistenceService (無狀態(tài))bean的注入失敗,并且實(shí)例本身被解析為null。
package blog.abhirockzz.wordpress.com;import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.logging.Level; import java.util.logging.Logger; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.ejb.Singleton; import javax.ejb.Startup; import javax.inject.Inject; import javax.websocket.ContainerProvider; import javax.websocket.DeploymentException; import javax.websocket.MessageHandler; import javax.websocket.Session; import javax.websocket.WebSocketContainer;@Singleton @Startup public class StockServiceBootstrapBean {private final String WS_SERVER_URL = "ws://api.stocks/ticker"; //fictitiousprivate Session session = null;@InjectStockInfoPersistenceService tickRepo;@PostConstructpublic void bootstrap() {WebSocketContainer webSocketContainer = null;try {webSocketContainer = ContainerProvider.getWebSocketContainer();session = webSocketContainer.connectToServer(StockTickerClient.class, new URI(WS_SERVER_URL));System.out.println("Connected to WS endpoint " + WS_SERVER_URL);session.addMessageHandler(new MessageHandler.Whole<String>() {@Overridepublic void onMessage(String msg) {tickRepo.save(msg.split(":")[0], msg.split(":")[1]);}});} catch (DeploymentException | IOException | URISyntaxException ex) {Logger.getLogger(StockServiceBootstrapBean.class.getName()).log(Level.SEVERE, null, ex);}}@PreDestroypublic void destroy() {close();}private void close() {try {session.close();System.out.println("CLOSED Connection to WS endpoint " + WS_SERVER_URL);} catch (IOException ex) {Logger.getLogger(StockServiceBootstrapBean.class.getName()).log(Level.SEVERE, null, ex);}} }就是這樣。 盡管這是一個(gè)相對簡單的示例,但很難想象可以在Web套接字服務(wù)器終結(jié)點(diǎn)接收的信息上應(yīng)用各種復(fù)雜的業(yè)務(wù)邏輯。 您可能還想考慮使用session.getAsyncRemote#sendAsync方法以異步方式向連接的客戶端發(fā)送消息。
干杯!
翻譯自: https://www.javacodegeeks.com/2015/07/websocket-client-api-in-java-ee-7.html
總結(jié)
以上是生活随笔為你收集整理的Java EE 7中的WebSocket客户端API的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 鹤壁房管局备案查询系统(鹤壁房管局备案查
- 下一篇: linux echo命令(linux e