在这篇博文中,让我们探讨较少讨论的 Web Socket Client API 以及如何在 Java EE 7 容器本身中利用它
Web 套接字服务器 API 规则
JSR 356 (Java 的 Web 套接字 API)的服务器端 API 最常用于构建 Web 套接字端点实现。通常,从客户端的角度来看,基于 HTML5(浏览器)的客户端利用标准的 JavaScript Web Socket API,这些客户端将自己附加到 Web 套接字服务器端点并享受双向和全双工通信。您会看到常见的示例,例如实时地图、股票行情、游戏、屏幕共享等应用程序——所有这些用例都非常适合 Web 套接字,而 Java EE 7 是构建可扩展的 Web 套接字驱动后端的理想平台。
Web Socket 客户端 API 怎么样?
Web Socket 规范还包括一个客户端 API,它强制要求所有 JSR 356(例如 Tyrus 、 Undertow 等)实现提供一个。有很多用例 可能不需要 基于浏览器/面向最终用户的 Web 套接字客户端。
例子
考虑一个场景,您想要连接到第三方 Web Socket 端点,使用它的信息并保留它以备后用?也许需要进一步分析?在这种情况下,在 Java EE 容器本身中利用客户端 API 很有用。
让我们用一个简单的例子来探讨这个问题。
(注释)Web Socket 客户端
注意: @OnMessage 的逻辑被故意排除,并以不同的方式实现(稍后澄清)
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 {
@OnClose
public void closed(Session session) {
System.out.println("Session " + session + " closed");
}
@OnError
public void error(Throwable error) {
System.out.println("Error: " + error.getMessage());
}
}
股票代码(信息)JPA 实体
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 {
@OnClose
public void closed(Session session) {
System.out.println("Session " + session + " closed");
}
@OnError
public void error(Throwable error) {
System.out.println("Error: " + error.getMessage());
}
}
一个无状态的bean
- 处理股票代码信息的持久性
- 针对 Java EE 7 容器提供的默认 JDBC 数据源执行其操作( 约定优于配置 !)
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 {
@OnClose
public void closed(Session session) {
System.out.println("Session " + session + " closed");
}
@OnError
public void error(Throwable error) {
System.out.println("Error: " + error.getMessage());
}
}
单例 EJB
- 利用 Web Socket ContainerProvider API
- 启动与 Web 套接字服务器的连接
- 注入 StockInfoPersistenceService bean 并在 addMessageHandler 实现中使用它
根据之前的说明,此处包含了本可以嵌入到 StockTickerClient 类中的 @OnMessage 注释方法中的(持久性)逻辑。这是因为 StockInfoPersistenceService (无状态)bean 的注入失败并且实例本身被解析为 null。
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 {
@OnClose
public void closed(Session session) {
System.out.println("Session " + session + " closed");
}
@OnError
public void error(Throwable error) {
System.out.println("Error: " + error.getMessage());
}
}
差不多就是这样。尽管这是一个相对简单的示例,但不难想象可以对 Web 套接字服务器端点接收到的信息应用任何类型的复杂业务逻辑。您可能还想考虑使用 session.getAsyncRemote#sendAsync 方法以异步方式向连接的客户端发送消息