2、异步HTTP编程

1、处理异步结果

       在内部,play框架是自下而上异步的。Play以异步、非阻塞方式处理每个请求。应用程序代码应尽量避免阻塞控制器,这种阻塞操作的常见例子有JDBC调用、流式API、HTTP请求和长计算。因此应尽量通过保持控制器异步的方法使得应用进行扩展,使系统在负载下保持响应。就是说,对于控制器中的一些阻塞的操作,尽量使用异步的方式进行处理。

       Action中的处理要求尽可能的快,但是如果使用异步(Action默认处理请求就是异步的),那么可能会有这样的问题,结果没有计算出来,响应就已经返回了,这是怎么处理呢?Java 8中提供了类CompletionStage和CompletableFuture这两个类不具体介绍,只需要知道可以实现使得程序异步又可以获取返回值,CompletionStage<result>最终将用result类型的值。返回CompletionStage<result>是一种编写非阻塞代码的技术。可以使用如下方式获取:

        实现异步处理、非阻塞编程的关键就在于CompletionStage,下边介绍一下如何使用,第一种可以通过配合HttpExecutionContext使用,可以通过依赖项注入play提供的play.libs.concurrent.httpExecutionContext实例,如下:

       只是使用HttpExecutionContext和CompletableFuture还是使用的play默认的上下文执行器,还需要使用CustomExecutionContext和HttpExecution实现非阻塞编程,如下:

可以通过使用实现响应超时问题的处理:

2、流式HTTP响应

       为了保持单个连接的开放性以服务于多个HTTP请求和响应,服务器必须随响应一起发送适当的内容长度的HTTP头。对于响应一些简单的文本结果,play可以自动识别并自动添加头信息返回客户端,但是对于一些复杂的内容,就需要开发者自己指定头信息,play提供了类play.http.httpentity用来实现此功能,使用如下:   

       在这里就有一个问题,为了计算头长度获取头信息,就需要将所有返回内容加载到内存,这里就可能存在问题:返回内容太大怎么办?下边先来一个返回结果的例子:     

       这里返回到客户端一个流对象,由于需要判断头信息,而play不能在流中直接获取头信息,这是就需要将整个流添加到内存中进行分析。Play中对于此问题,早已提供实现,直接调用ok(new File(“文件路径”))即可。

       上边这种方式返回的文件大小必须是确定的,对于文件大小不能确定的、动态变化的就需要使用分块传输编码技术,使用如下: 

3、Comet套接字

      使用分块传输编码技术实现Comet。Comet套接字是一个分块的text/HTML响应,只包含<script>元素。对于每个块,我们编写一个包含JavaScript的<script>标记,该标记立即由Web浏览器执行。这样我们就可以从服务器向Web浏览器实时发送事件:对于每条消息,将其包装成一个调用javascript回调函数的<script>标记,并将其写入分块响应。

       因为ok().chunked利用akka流获取流<bytestring>,所以我们可以发送一个元素流并对其进行转换,以便在javascript方法中对每个元素进行转义和包装。Comet帮助程序自动执行Comet套接字,为浏览器兼容性推送初始空白缓冲区数据,并支持字符串和JSON消息。

下边介绍几个Comet的使用:

字符串流中使用Comet:    

Json流中使用Comet:

Iframe中使用Comet:

4、WebSockets(网络套接字)

        WebSockets是基于允许双向全双工通信的协议从Web浏览器使用的套接字。只要服务器和客户机之间有活动的WebSocket连接,客户机就可以发送消息,服务器就可以随时接收消息。WebSokets不能通过标准动作来处理。Play的WebSocket处理机制是围绕Akka流构建的。WebSocket被建模为流,传入的WebSocket消息被送入流中,流生成的消息被发送到客户机。play提供了一些在WebSocket中构造WebSocket的工厂方法。

接下来介绍play中如何处理websocket。

       使用actors处理websocket,可以使用play实用程序ActorFlow将actorRef转换为流。此实用程序接受一个函数,该函数将actorRef转换为向akka.actor.props对象发送消息,该对象描述在接收WebSocket连接时play应创建的参与者:  

从客户端接收到的任何消息都将发送给参与者,而由play提供的任何消息都将发送给客户端,当websocket关闭时,actor将被停止,可以通过实现actors的 poststop方法来处理需要关闭的资源:

有时候希望拒绝WebSocket请求,例如,如果必须对用户进行身份验证才能连接到WebSocket,Play为此目的提供了AcceptorResult  WebSocket  Builder:

想要实现异步接收WebSocket,直接使用CompletionStage<WebSocket<A>>代替WebSocket<A>即可。

处理其他类型数据的请求:

还可以直接使用akka流处理WebSockets,如下:

WebSocket可以访问请求头(来自启动WebSocket连接的HTTP请求),但是,它不能访问请求主体,也不能访问HTTP响应

发送hello之后丢弃输入数据并关闭套接字:

输入数据记录到标准输出,然后使用映射流发送回客户机:

配置websocket的帧长度有两种方式,在启动应用是使用:

play.server.websocket.frame.maxLength 或者

Sbt -Dwebsocket.frame.maxLength=256k run

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

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

相关文章

3、play中的模板引擎

1、模板格式 Play默认的模板引擎是一种基于scala的安全模板引擎&#xff0c;尽管模板引擎使用Scala作为表达式语言&#xff0c;但是非常简单易学。参数类型使用后缀语法指定&#xff08;例如&#xff1a; id&#xff1a;Long&#xff09;&#xff0c;泛型类型是使用[]符号&…

.NET Core调用WCF的最佳实践

现在.NET Core貌似很火&#xff0c;与其他.NET开发者交流不说上几句.NET Core都感觉自己落伍了一样。但是冷静背后我们要也看到.NET Core目前还有太多不足&#xff0c;别的不多说&#xff0c;与自家的服务框架WCF集成起来就不咋地&#xff0c;从最初不支持&#xff0c;到现在有…

4、表单提交和验证

1、启用/禁用表单module sbt启动应用时默认就启用了表单&#xff0c;也可以在build.sbt中添加启用libraryDependencies javaForms&#xff0c;想要移除表单时使用PlayMinimalJava 插件 2、play接收表单数据 play.data中的类可用于处理HTTP表单数据提交和验证&#xff0c;操…

【贪心】最佳浏览路线问题

最佳浏览路线问题最佳浏览路线问题最佳浏览路线问题 题目描述 某旅游区的街道成网格状&#xff08;见图&#xff09;&#xff0c;其中东西向的街道都是旅游街&#xff0c;南北向的街道都是林荫道。由于游客众多&#xff0c;旅游街被规定为单行道。游客在旅游街上只能从西向东…

Ooui:在浏览器中运行.NET应用

在过去数年中&#xff0c;桌面应用开发人员一直处境艰难&#xff0c;因为人们的主要关注点聚焦于Web和移动应用。由于Microsoft未来Windows平台的计划未定&#xff0c;并且UWP应用也没有突破性进展&#xff0c;因此技术落伍的责任也不应由.NET开发人员来承担。当前迫切需要解决…

5、play中的json数据处理

1、play中的json库 Play使用Jackson JSON库将对象转换为JSON和JSON之间的对象。play的操作使用JsonNode类型&#xff0c;play.libs.json包中有操作json数据的方法 2、java对象和json数据 将java对象转成play中的JsonNode类型&#xff1a; 将JsonNode格式的数据解析到java对象…

农行基于TFS工具的敏捷转型实践

““春天工程”项目组是应用开发二部最早采用敏捷模式的项目组&#xff0c;项目组在项目推进过程中使用Scrum框架&#xff0c;结合“看板站会”形式&#xff0c;积极探索项目推进新措施。结合TFS工具逐步实现了电子工具与物理看板的有机融合&#xff0c;并在过程管理、版本管理…

6、XML数据处理

1、处理xml请求 两种方式&#xff0c;一是直接将请求体数据转成Document对象&#xff1a; 二是定义自己的解析格式将请求体进行解析&#xff1a; 2、返回xml格式数据响应 设置响应头格式为application/xml类型

.NET Core:新的快速开发平台

.NET Core 今年已经发布了 2.0 版本了。技术雷达最近将 .NET Core 从“评估”移到了“试用”阶段&#xff0c;意味着运用这项技术的风险在不断减小。本文将简要介绍基于 .NET Core 的快速开发的方式。.NET Core 产生于 2014年&#xff0c;是一个不折不扣的新开发平台。SmallTal…

7、play中的文件上传

1、基本的文件上传处理 将form的类型设置成multipart/form-data&#xff0c;请求的方式必须是POST类型&#xff0c;实例如下&#xff1a; 请求发到controller&#xff0c;controller中处理&#xff1a; public Result upload() {MultipartFormData<TemporaryFile> bod…

分布式高性能消息处理中心HPMessageCenter

HPMessageCenter高性能消息分发中心。用户只需写好restful接口&#xff0c;在portal里面配置消息的处理地址&#xff0c;消息消费者就会自动访问相关接口&#xff0c;完成消息任务。&#xff08;其实HPMessageCenter有两个版本&#xff0c;这次开源的是第二个版本。在第一个版本…

8、play框架中持久层操作

1、使用jdbc连接数据库 1、1 简介 JDBC是一个阻塞操作&#xff0c;它将导致线程等待&#xff0c;直接使用JDBC进行查询将导致性能降低 1、2 配置数据源 play提供了一个用于管理JDBC连接池的插件&#xff0c;可以根据需要配置任意多个数据库&#xff0c;想要使用此插件&…

DBCHM-最简单、实用的数据库表列批注维护工具

DBCHM支持SqlServer/MySql/Oracle/PostgreSQL/Sqlite等数据库的表列批注维护管理。DBCHM有以下几个功能表&#xff0c;列的批注可以编辑保存到数据库。表&#xff0c;列的批注支持通过pdm文件导入的方式进行更新到数据库。基于数据库中的表列结构(列ID/列名/数据类型/长度/精度…

浅谈Log4net在项目中如何记录日志

一 引入背景在软件开发周期中&#xff0c;无论是开发中&#xff0c;或是测试中&#xff0c;或是上线后&#xff0c;选择合适的工具监控程序的运行状态至关重要&#xff0c;只有如此&#xff0c;才能更好地排查程序问题和检测程序性能问题等。本篇文章主要与大家分享&#xf…

9、play中缓存的使用

1、简介 对于存储在缓存中的任何数据&#xff0c;都需要放置一个再生策略&#xff0c;以防数据丢失。这一理念是play基本原则之一。对于进程内缓存&#xff0c;Caffeine 通常是最佳选择。如果需要分布式缓存&#xff0c;play提供了Memcached和Redis的第三方插件。 2、添加缓存…

10、使用ws调用Rest api

目录 1、简介 2、添加WS配置 3、发送请求 4、处理请求 5、常用模式和用例 6、自定义BodyReadables和BodyWritables 6、独立WS 7、访问AsyncHttpClient 8、配置WS 1、简介 有时我们想从一个play应用程序中调用其他HTTP服务。Play提供了WS库来进行异步HTTP方法调用。 …

拥抱开源,Office 365 开发迎来新时代

前言作为全球最大的开放源代码托管平台&#xff0c;Github在上周迎来了它的十岁生日。自从2008年正式上线以来&#xff0c;Github上面汇聚了数以千万计的开发人员和各种项目&#xff0c;它几乎成为了开源的代名词和风向标&#xff0c;各大软件巨头都纷纷支持&#xff0c;在广大…

11、OAuth和OpenID服务

1、OAuth 1、1 简介 OAuth是发布受保护数据并与之交互的简单方法。对于人们来说&#xff0c;这也是一种更安全的访问方式。例如&#xff0c;它可以用来访问你的用户在Twitter上的数据。Play仅提供对OAuth 1.0的支持。 1、2 基本工作原理 在build.sbt中添加配置&#xff1a;…

求凸函数极值 CSF迭代法(雾)

简介 本算法用来求解凸函数极值点的问题&#xff0c;由我在写ACM习题时想到&#xff0c;在网上并未找到这样的算法&#xff0c;拿出来给大家分享一下&#xff0c;如果网上没有的话&#xff0c;我决定给它起名叫做 CSF迭代法&#xff0c;如果这个算法早已经存在&#xff0c;那就…

12、play整合Akka

1、简介 Akka使用actor模型来提高抽象级别&#xff0c;并提供一个更好的平台来构建正确的并发和可扩展的应用程序。在容错方面&#xff0c;它采用了“Let it crash”的模式&#xff0c;这种模式在电信行业获得了巨大成功&#xff0c;用于构建永不停止的自我修复系统应用程序。…