Java EE 7中的WebSocket客户端API

在本文中,让我们探索谈论较少的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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358305.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mongo-express 远程代码执行漏洞(CVE-2019-10758)

前言 mongo-express是一款mongodb的第三方Web界面&#xff0c;使用node和express开发。如果攻击者可以成功登录&#xff0c;或者目标服务器没有修改默认的账号密码&#xff08;admin:pass&#xff09;&#xff0c;则可以执行任意node.js代码。 影响版本 mongo-express&#xff…

【转】深入浅出PageRank算法

原文链接 http://segmentfault.com/a/1190000000711128 PageRank算法 PageRank算法是谷歌曾经独步天下的“倚天剑”&#xff0c;该算法由Larry Page和Sergey Brin在斯坦福大学读研时发明的&#xff0c; 论文点击下载: The PageRank Citation Ranking: Bringing Order to the We…

下面的语言中哪些语言是动态语言( )

下面的语言中哪些语言是动态语言(B ) A.C B.JavaScript C.C D.CSS E.Java F.Objective-C 解析 静态语言&#xff08;强类型语言&#xff09; 静态语言是在编译时变量的数据类型即可确定的语言&#xff0c;多数静态类型语言要求在使用变量之前必须声明数据类型。 例…

https://blog.csdn.net/weixin_40412037/article/details/112235003

一、工具简介 说明&#xff1a; 这是一款基于主机的漏洞扫描工具&#xff0c;采用多线程确保可以快速的请求数据&#xff0c;采用线程锁可以在向sqlite数据库中写入数据避免database is locked的错误&#xff0c;采用md5哈希算法确保数据不重复插入。 本工具查找是否有公开e…

前端工程师能力评估测试题(2020最新版附答案及解析)

1.下列哪个样式定义后,内联(非块状)元素可以定义宽度和高度 (C) A.display:inline B.display:none C.display:block D.display:inherit 解析 2.css属性overflow属性定义溢出元素内容区的内容会如何处理。如果值为 scroll,不论是否需要,用户代理都会提供一种滚动机…

埃氏筛法的一般写法(区间筛法)

问题&#xff1a; 求 $[L, R]$ 之间的素数表 解法&#xff1a; 一个合数 $n$ 的最小素因子不超过 $\sqrt{n}$。 先用埃氏筛法求出 $[1,\lfloor \sqrt{R} \rfloor]$ 上的素数表 再在 $[L, R]$ 上用埃氏筛法求素数 const int N(1e5); bool isprime[N]; int prime[N]; void init()…

滥用static_沉思滥用:“强力使用,破坏滥用”

滥用static前英国首相本杰明迪斯雷利&#xff08;Benjamin Disraeli&#xff09;曾用过一句古话&#xff0c;说这是三种谎言&#xff1a;“谎言&#xff0c;该死的谎言和统计数据”。 这里的暗示是&#xff0c;统计数字很容易弥补&#xff0c;因此不可靠。 但是&#xff0c;统计…

Cobalt strike加载插件出现乱码

问题描述 插件 加载成功出现乱码 解决方法 在Cobalt strike目录下执行命令指定编码打开客户端解决。 java -Dfile.encodingutf-8 -XX:ParallelGCThreads4 -XX:AggressiveHeap -XX:UseParallelGC -Xms512M -Xmx1024M -jar cobaltstrike.jar1 成功解决

新网站链接提交入口攻略

很多网站没有被收录,也没有排名,经常有SEO站长向我抱怨。其实提升网站收录有方法和诀窍的。下面我详细的为大家分享,如何向百度提交链接,提升网站被的机率。 很多新手站长,网站上线后没有主动的向搜索引擎提交,spider在短期内无法第一时间发现新网站,这个时候我们 需要…

MariaDb数据库管理系统的学习(一)安装示意图

MariaDB数据库管理系统是MySQL的一个分支。主要由开源社区在维护&#xff0c;採用GPL授权许可。开发这个分支的原因之中的一个是&#xff1a;甲骨文公司收购了MySQL后&#xff0c;有将MySQL闭源的潜在风险&#xff0c;因此社区採用分支的方式来避开这个风险。 MariaDB的目的是全…

内置序列化技术

本文是我们名为“ 高级Java ”的学院课程的一部分。 本课程旨在帮助您最有效地使用Java。 它讨论了高级主题&#xff0c;包括对象创建&#xff0c;并发&#xff0c;序列化&#xff0c;反射等。 它将指导您完成Java掌握的过程&#xff01; 在这里查看 &#xff01; 目录 1.简…

初级前端工程师笔试技巧总结,祝你顺利拿高分

某大型外包公司安排新人去某大型保险公司驻场开发,简单粗暴的衡量一个工程师的水平就是笔试,这个环节是必不可少的,必须要过了笔试题才能算正式的驻场开发,不然只能是支持,消耗公司资源的废柴,一般笔试会有两次机会,我特殊情况考了三次,一套安全题(10题选择题共100分,…

HDU 5439 Aggregated Counting

题目大意&#xff1a; 由1开始不断往数组中添加数 就是按照当前所在位置所在的数表示的个数添加这个数目的数 1 2 2 3 3 后面因为要填4&#xff0c;而4号位置为3&#xff0c;说明之后要填3个4 问题就是给定一个n&#xff0c;找到n出现的最后位置p&#xff0c;再找p出现的最后位…

Ubuntu 安装msfconsole

Ubuntu 安装msfconsole 1.进入到opt目录下 cd /opt/1 2.下载安装文件 msfupdate.erb sudo wget https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/metasploit-framework-wrappers/msfupdate.erb1 3.将文件msfupdate.erb重命名为msfinstal…

域名解析是否生效实时检测(阿里云DNS检测)

测试域名解析生效的方法有以下四类 域名解析生效测试本地域名解析生效测试测试命令dig或nslookup全国各地运营商解析生效测试域名解析生效测试 可帮助用户快速排查域名、DNS、网站问题,点击下方蓝色字体立即测试。 阿里云DNS检测 本地域名解析生效测试 此查询工具可以检测…

为什么需要多线程

对于这个问题可能很多朋友会说是为了高性能&#xff0c;个人觉得这是误解&#xff0c;多线程不等于高性能&#xff0c;从cpu&#xff08;单核&#xff09;的角度上看单线程才能带来最高性能。 对于单纯的运算任务来说一条线程依次执行到底肯定是最快速的&#xff08;因为线程间…

PhpMyAdmin后台getshell

PhpMyAdmin简介 PhpMyAdmin 是一个以PHP为基础&#xff0c;以Web-Base方式架构在网站主机上的MySQL的数据库管理工具&#xff0c;让管理者可用Web接口管理MySQL数据库。借由此Web接口可以成为一个简易方式输入繁杂SQL语法的较佳途径&#xff0c;尤其要处理大量资料的汇入及汇出…

app mvc框架_Google App Engine上的Spring MVC和REST

app mvc框架前段时间&#xff0c;我写了一篇关于如何使用Spring MVC实现Restful Web API的文章 。 阅读我以前的文章以了解它。 在那篇文章中&#xff0c;它开发了一个简单的Rest示例。 为了测试该应用程序&#xff0c;将文件复制到Web服务器&#xff08;例如Tomcat &#xff0…

谷歌浏览器如何将繁体字设置成中文?

今天刚拿到公司发给我的电脑,这个电脑是戴尔的,不知道用了多少年啦,处理器是i3的,CPU8+50O还行,总体感觉一般,不卡顿,办公的地方网速跟蜗牛一样,整个电脑应该是重置过的或者重装了系统,作为开发下载常用的浏览器(谷歌、火狐、IE)、编译器、IM工具等还是很有必要的,…

Python学习笔记 -- 第一章

本笔记参考廖雪峰的Python教程 简介 Python是一种计算机高级程序设计语言. 用Python可以做什么&#xff1f; 可以做日常任务&#xff0c;比如自动备份你的MP3&#xff1b;可以做网站&#xff0c;很多著名的网站包括YouTube就是Python写的&#xff1b;可以做网络游戏的后台等等&…