在本文中,让我们探索谈论较少的Web Socket Client API,以及如何在Java EE 7容器本身中利用它。

Web套接字服务器API规则

JSR 356的服务器端API(Java的Web套接字API)最常用于构建Web套接字端点实现。 从客户端的角度来看,基于JavaScriptHTML5(浏览器)客户端经常利用标准JavaScript Web套接字API,这些客户端将自己附加到Web套接字服务器端点,并享受双向和全双工通信。 您将看到常见的示例,例如实时地图,股票行情自动收录器,游戏,屏幕共享等应用程序-所有这些用例都是Web套接字的完美选择,而Java EE 7是构建可扩展Web套接字驱动的后端的理想平台。

Web Socket客户端API呢?

Web套接字规范还包括客户端API,并且它对于所有JSR 356(例如Tyrus , Undertow等)实现都必须提供的API。 在相当多的用例中, 可能不需要面向浏览器/面向Web套接字客户端的最终用户。

考虑一种情况,您想连接到第三方Web Socket端点,使用其信息并将其保留以备后用? 也许有待进一步分析? 在这种情况下,利用Java EE容器本身内的客户端API很有用。

让我们通过一个简单的示例对此进行探讨。

(带注释)Web Socket Client

注意: @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 {@OnClosepublic void closed(Session session) {System.out.println("Session " + session + " closed");}@OnErrorpublic void error(Throwable error) {System.out.println("Error: " + error.getMessage());}}

股票代码(信息)JPA实体

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 ...
}

无状态豆

  • 处理股票行情信息的持久性
  • 针对Java EE 7容器提供的默认JDBC数据源执行其操作( 约定优于配置 !)
package blog.abhirockzz.wordpress.com;import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;@Stateless
public class StockInfoPersistenceService {@PersistenceContextEntityManager em;public void save(String name, String price){em.persist(new StockTick(name, price));}
}

单例EJB

  • 利用Web Socket ContainerProvider API
  • 启动与Web套接字服务器的连接
  • 注入StockInfoPersistenceService bean并在addMessageHandler实现中使用它

如前所述,这里包含了(持久性)逻辑,该逻辑可以嵌入在StockTickerClient类的@OnMessage注释方法中。 这是因为StockInfoPersistenceService (无状态)bean的注入失败,并且实例本身被解析为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);}}
}

就是这样。 尽管这是一个相对简单的示例,但很难想象可以在Web套接字服务器终结点接收的信息上应用各种复杂的业务逻辑。 您可能还想考虑使用session.getAsyncRemote#sendAsync方法以异步方式向连接的客户端发送消息。

干杯!

翻译自: https://www.javacodegeeks.com/2015/07/websocket-client-api-in-java-ee-7.html

Java EE 7中的WebSocket客户端API相关推荐

  1. react api_使用Java EE 8中的React式API加速服务

    react api 服务通常可以通过异步处理进行优化,即使不改变其对外界的行为. 某些服务效率不高的原因是,它们需要等待其他服务提供结果才能继续下去. 让我们看一下如何在不等待外部REST服务的情况下 ...

  2. 使用Java EE 8中的反应式API加速服务

    服务通常可以通过异步处理进行优化,即使不改变其对外界的行为. 某些服务效率不高的原因是,它们需要等待其他服务提供结果才能继续下去. 让我们看一下如何在不等待外部REST服务的情况下调用它们,并独立进行 ...

  3. 在 Java EE 组件中使用 Camel Routes

    2019独角兽企业重金招聘Python工程师标准>>> 摘要:你可以通过集成 Camel 和 WildFly 应用服务器(使用 WildFly-Camel 子系统)在 Java EE ...

  4. java ee各类组件_在Java EE组件中使用骆驼路线

    java ee各类组件 从现在开始我一直在与Camel合作,我真的很喜欢它的简单性. 在Java EE之上使用它一直是一个挑战,我最近发表了一篇关于如何做到这一点的演讲,而在Java EE中引导Cam ...

  5. 在Java EE组件中使用骆驼路线

    从现在开始我一直在与Camel合作,我真的很喜欢它的简单性. 在Java EE之上始终使用它一直是一个挑战,而我最近发表的有关如何做到这一点的演讲之一以及Java EE中引导Camel的不同方法实际上 ...

  6. Java EE 7中包含哪些JSR?

    我开始填写所有应该加入Java EE 7的Java规范请求的表. 由于平台版本仍在确定中,因此某些细节很难确定. 完整的Java EE 7 EJB产品具有以下标准组件和API: 名称 版 描述 JSR ...

  7. Oracle把Java EE的未来押在Rest API上了?

    Oracle正在向REST 和 JSON倾斜以使Java EE 适应微服务和云的现代趋势. \\ 作为一种提供Web服务通信的机制,似乎REST从很久以前就抢过了SOAP的风头.SOAP 因其复杂性已 ...

  8. js ajax 访问java函数,将url分配给Java EE项目中的ajax(js)函数

    我正在Ajax中尝试使用我的第一个项目,并且在分配指向要从服务器中获取的文件的绝对URL时遇到问题.将url分配给Java EE项目中的ajax(js)函数 这是我的函数: function fetc ...

  9. Java 11:新的HTTP客户端API

    在Java 11中,已将最初在Java 9中引入的孵化HTTP客户端API进行了标准化. 它使连接URL,管理请求参数,cookie和会话更加容易,甚至支持异步请求和websocket. 回顾一下,这 ...

最新文章

  1. Python使用matplotlib可视化斜率图、对比同一数据对象前后(before、after)两个状态的差异(Slope Chart)
  2. Spring和shiro整合 logout 配置方式
  3. python中访问命令行参数_如何在Python中访问命令行参数?
  4. C# 网络编程之使用Socket类Send、Receive方法的同步通讯
  5. 【Linux】一步一步学Linux——nice命令(127)
  6. kernel并发控制:自旋锁、互斥体、中断屏蔽
  7. LOJ 2339 「WC2018」通道——边分治+虚树
  8. ORACLE利用scn赚钱,在Oracle中增进SCN及案例介绍
  9. 如何直观的长时间统计Android应用的动态内存消耗
  10. VMware Server1.03下载地址及序列号
  11. 人民日报刊发浪潮集团董事长孙丕恕署名文章:更好实现数据共享
  12. JDK 1.6 API 中文版
  13. 万能硬盘数据恢复软件注册码真的可以用吗?
  14. java.lang.NoClassDefFoundError: Could not initialize class org.apache.batik.bridge.CursorManager
  15. 最大化参数 火车头_新手必看的火车头采集器使用入门教程_图文解说版!(看完包会)...
  16. 为什么正定矩阵等于转置_正定矩阵的定义性质-正定矩阵的判定方法-正定矩阵转置和本身...
  17. 《智能商业》读后感作文5000字
  18. 对话清华大学周昊,详解IJCAI杰出论文及其背后的故事
  19. 81章 老子1章到_《老子》第一章新解
  20. C++之回炉再造笔记--问题记录1

热门文章

  1. java实现遍历树形菜单方法——实体类VoteTree
  2. 19年8月 字母哥 第五章 静态资源与模板引擎的整合 用热点公司网不行
  3. shiro-权限概述
  4. java高效字符串首字母大小写转换
  5. Dom4j完整教程详解
  6. 解决eclipse中tomcat无法识别maven web项目问题
  7. 在win10系统中安装Visual C++ 6.0的具体方法
  8. spring(11)使用对象-关系映射持久化数据
  9. java数据库编程——事务
  10. super 和 this 关键字的比较+调用构造器(this)+动态绑定