在Grails 2.0中使用Servlet 3.0异步功能

上周,我与某人谈论了Grails 2中对Servlet 3.0异步功能的新支持,并意识到我对可用功能并不了解。 所以我想我会尝试一下并分享一些例子。 该文档对这个主题有些了解,因此首先介绍一些背景信息。
在3.0规范中进行异步工作的主要方式是javax.servlet.ServletRequest类中的新startAsync方法。 这将返回javax.servlet.AsyncContext接口的实例,该实例具有生命周期方法(例如dispatchcomplete ,为您提供了对请求和响应的挂钩,并允许您注册javax.servlet.AsyncListener 。 您调用传入Runnablestart方法来执行异步工作。 使用这种方法可以释放服务器资源而不是进行阻塞,这可以提高可伸缩性,因为您可以处理更多的并发请求。
为了使用此功能,处理请求的servlet必须支持异步,并且过滤器链中所有应用的过滤器也必须支持。 主Grails Servlet( GrailsDispatcherServlet )在web.xml模板的3.0版本中注册,并且async-supported属性设置为true。 Servlet3AsyncWebXmlProcessor生成后,将<async-supported>true</async-supported>到web.xml中的所有过滤器声明中。 这样就为您覆盖了; 您没有必需的web.xml配置。
您还必须配置为使用Servlet API 3.0。 这很容易做到; 只需将grails.servlet.version的值grails.servlet.version为“ 3.0? 默认值“ 2.5”。 请注意,application.properties中有一个旧设置,名称为app.servlet.version ; 您应该从application.properties文件中删除此行,因为它的值在运行时会被BuildConfig.groovy中的值忽略并覆盖。
但是,您不会在控制器的请求上调用startAsync ; 直接在控制器上调用startAsync 。 此方法是作为控制器方法添加的(作为Controller的AST转换的一部分,从ControllersAsyncApi连接 (如果您感到好奇,可以通过ControllerAsyncTransformer连接 ))。 调用控制器的startAsync方法非常重要,因为它可以执行所有标准工作,而且还可以添加Grails集成。 这包括添加逻辑以集成所有已注册的PersistenceContextInterceptor实例,例如将Hibernate Session绑定到线程,完成后刷新等,并与Sitemesh集成。 这是通过返回的实例来实现的
GrailsAsyncContext为其余部分添加额外的行为并委托给容器提供的实际实例(例如Tomcat中的org.apache.catalina.core.AsyncContextImpl )。
请求中还有其他一些与异步相关的新方法。 它们包括boolean isAsyncStarted()AsyncContext getAsyncContext()
我已经附加了一个示例应用程序(请参阅下面的链接)以演示这些功能。 有两个部分: 一个异步查询股票价格的简单控制器,以及一个聊天应用程序。
StockController非常简单。 它只有一个动作,因此会暂停以查询所请求的股票报价器的当前股价。 它异步执行此操作,但通常速度非常快,因此您可能看不到与串行方法的真正区别。 但是,这种模式可以推广到执行更多耗时的任务。
调用http:// localhost:8080 / asynctest / stock / GOOG,http:// localhost:8080 / asynctest / stock / AAPL,http:// localhost:8080 / asynctest / stock / VMW等进行测试。
第二个示例涉及更多,并基于Java EE 6 SDK中的“ async-request-war”示例。 这实现了一个聊天应用程序(它以前是通过Comet实现的)。 SDK的示例是一个大servlet。 我将其拆分为一个控制器以执行标准请求工作,并将其ChatManagerChatManager类(在resources.groovy中注册为Spring Bean)来处理客户端注册,消息排队和调度以及相关的错误处理。
该实现使用隐藏的iframe来启动长时间运行的请求。 它永远不会完成,并且用于将消息发送回每个注册的客户端。 当您“登录”或发送消息时,控制器将处理请求并将响应消息排队。 然后, ChatManager循环遍历每个已注册的AsyncContext ,并将JSONP发送到iframe,该iframe使用传入消息更新主页中的文本区域。
使我困扰了很长时间的一件事是,该示例在SDK示例中运行良好,但在我的示例中却无法运行。 一切看起来不错,但iframe并未收到消息。 事实证明,这是由于进行了适当的优化以使响应呈现尽可能快。 不幸的是,这导致响应编写器上的flush()调用被忽略。 由于我们需要响应式更新,并且不会呈现较大的html页面,因此我添加了代码来查找由Grails代码包装的真实响应,并直接发送给它。
在两个浏览器中打开http:// localhost:8080 / asynctest /尝试一下。 一旦您“登录”到两者,发送的消息将在两个浏览器中显示。
有关测试应用程序的一些注意事项:
  • 所有客户端逻辑都在web-app / js / chat.js中
  • grails-app / views / chat / index.gsp是主页; 它创建了文本区域来显示消息,而隐藏的iframe保持连接状态并收听消息
  • 这需要实现3.0规范的Servlet容器。 由tomcat插件提供并由run-app使用的Tomcat版本,而所有7.x版本的Tomcat都有。
  • 我运行install-templates并编辑了web.xml以添加metadata-complete="true"以防止Tomcat扫描所有jar文件中的带注释的类–由于版本7.0.26中修复的错误(当前未发布 ,因此这可能导致OOME)
  • 由于聊天部分基于旧代码,因此它使用Prototype,但可以轻松使用jQuery。

您可以在此处下载示例应用程序代码。

参考: An Solipsists博客上的JCG合作伙伴 Burt Beckwith 提供的在Grails 2.0中使用Servlet 3.0异步功能 。


翻译自: https://www.javacodegeeks.com/2012/06/using-servlet-30-async-features-in.html

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

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

相关文章

接口怎么实例化?

最开始看到数据库连接的时候忽然想到这个问题&#xff1a; Connection connull;try {Class.forName(Driver);} catch (ClassNotFoundException e) {e.printStackTrace();}try {conDriverManager.getConnection(url, user, pass);} catch (SQLException e) {e.printStackTrace()…

css中基线指的是哪一条线,如何设置基线网络_CSS, Vertical Rhythm 教程_W3cplus

首先&#xff0c;当谈到排版&#xff0c;我们先要了解基线是什么&#xff1f;维基百科是这样定义)的&#xff1a;在排版和书法中&#xff0c;基线是以字终sit底线为基础&#xff0c;并且向两边延伸的直线。好极了&#xff0c;但我为什么要忽视他呢&#xff1f;好希望你充满激情…

libvirt里的面向对象的C语言

C语言&#xff1a;类的声明和定义 1 // 通用父类的定义2 struct _virClass {3 virClassPtr parent;4 5 unsigned int magic;6 char *name;7 size_t objectSize;8 9 virObjectDisposeCallback dispose; 10 }; 11 typedef struct _virClass virClass; 12 typ…

使用JGroups进行ElasticMQ消息复制

ElasticMQ是一台消息服务器&#xff0c;具有Scala&#xff0c;Java和与Amazon SQS兼容的接口。 它通过跨服务器群集复制消息来支持有保证的消息传递&#xff0c;并通过日志记录实现消息持久性。 消息复制是ElasticMQ的核心功能之一。 但是&#xff0c;如果您看一下代码&#xf…

ajax省市二级联动硬编码,AJAX请求接受硬编码的JSON,但不接受软编码

这个AJAX请求返回&#xff06;&#xff03;39;成功&#xff06;&#xff03;39;如果PHP中的输出被复制并粘贴了JSON&#xff0c;但是&#xff06;&#xff03;39;失败&#xff06;&#xff03;39;如果它是由文件生成的。看看下面api.php中的评论&#xff0c;看看我的意思。$.aj…

Fiddler高级技巧 - 映射路径到本地文件夹

适用场景&#xff1a; 你是前端开发人员&#xff0c;要开发一个小模块&#xff0c;需要用到线上的环境&#xff08;账号、数据、跨域等&#xff09;&#xff0c;但你又没有权限往线上传文件你是移动测试人员&#xff0c;需要将一组接口的返回结果替换为另一组&#xff0c;最简单…

Spring Social入门

像我一样&#xff0c;无论是添加简单的Facebook“赞”按钮&#xff0c;一大堆“共享”按钮还是显示时间轴信息&#xff0c;您都不会注意到当前对应用程序“社交化”的热衷。 每个人都在做这件事&#xff0c;包括Spring的家伙&#xff0c;事实上&#xff0c;他们提供了一个称为S…

apache ajax 跨域访问,Apache 实现AJAX跨域请求

当使用ajax跨域请求时&#xff0c;浏览器报错&#xff1a;XmlHttpRequest error: Origin null is not allowed by Access-Control-Allow-Origin.肯定是跨域的问题&#xff0c;如果用jsonp或者pro更多&#xff1a;当使用ajax跨域请求时&#xff0c;浏览器报错&#xff1a;XmlHtt…

14、数据库

数据库转载于:https://www.cnblogs.com/quyong/p/6687924.html

EhCache复制:RMI与JGroups

最近&#xff0c;我正在研究一种需要复制缓存的产品。 缓存提供程序已经确定-EhCache&#xff0c;剩下的就是有关传输的问题。 哪一个是最佳选择&#xff1f; 这里的最佳选择是指性能更好的选择。 仅在两个可用传输之间进行了性能评估-JGroups和RMI&#xff0c;对其他传输不予考…

Oracle 监控语句整理(包括TOP SQL等)

希望能对大家有所帮助&#xff01; 很多时候大家想查看oracle数据库中的sql语句执行情况&#xff0c;但是又不知道如何是好&#xff0c;今天在这里为大家提供一个sql语句&#xff0c;大家可以通过以下的sql语句查询Oracle数据库中Top Sql情况&#xff1a; 查询结果可按照PCT、总…

服务器wifi无线放大器,一回家WiFi信号太弱?教你用两毛钱制作信号放大器

原标题&#xff1a;一回家WiFi信号太弱&#xff1f;教你用两毛钱制作信号放大器现在家家户户都有无线路由器&#xff0c;但是大部分人都还是早期的单天线产品&#xff0c;信号覆盖范围比较小&#xff0c;特别是穿墙性能不行。人在客厅WiFi信号还满格&#xff0c;一到卧室就瞬间…

iOS开发 之 可穿戴设备 蓝牙4.0 BLE 开发

1 前言 当前有越来越多的可穿戴设备使用了蓝牙4.0 BLE&#xff08;Bluetooth Low Energy)。对于iOS开发而言&#xff0c;Apple之前专门推出CoreBluetooth的Framework来支持BLE的开发。对于硬件开发有了解的朋友应该知道&#xff0c;在之前使用低版本的蓝牙的设备&#xff0c;要…

将Java服务公开为Web服务

本教程解决了开发人员面临的最实际的情况。 大多数时候&#xff0c;我们可能需要将某些现有服务公开为Web服务。 在项目生命周期的不同阶段可能会遇到这种情况。 如果这是初始阶段&#xff0c;那么您几乎是安全的&#xff0c;您可以为此做好充分的准备。 但是&#xff0c;将要发…

git服务器维护 备份,gitlab服务运维,备份与恢复 - 橙子柠檬's Blog

gitlab服务运维工作Gitlab-ctl 使用gitlab-ctl start #启动服务gitlab-ctl stop #停止服务gitlab-ctl restart #重启服务检查服务的日志信息gitlab-ctl tail redis #检查redis的日志gitlab-ctl tail postgresql #…

angular js实现开关效果

功能&#xff1a;实现点击排序&#xff0c;再点击排倒序。 实现方法如下 方法一&#xff1a;定义变量实现点击切换true或false&#xff0c;代码为&#xff1a; $scope.lidata [ {"name":"Terry","age":12}, {&qu…

使用TestNG的弹簧测试支持

TestNG是一个测试框架&#xff0c;旨在涵盖所有类别的测试&#xff1a;单元&#xff0c;功能&#xff0c;端到端&#xff0c;集成等。 它包括许多功能&#xff0c;例如灵活的测试配置&#xff0c;对数据驱动测试的支持&#xff08;使用DataProvider&#xff09;&#xff0c;强大…

Entity Framework - 理清关系 - 基于外键关联的单向一对一关系

注&#xff1a;本文针对的是 Entity Framework Code First 场景。 之前写过三篇文章试图理清Entity Framework中的一对一关系&#xff08;单相思&#xff08;单向一对一&#xff09;, 两情相悦&#xff08;双向一对一&#xff09;, 两情相悦-续&#xff09;&#xff0c;但当时理…

微信社交小程序服务器,Day12-微信小程序实战-交友小程序-搭建服务器与上传文件到后端...

要搞一个小型的cms内容发布系统因为小程序上线之后&#xff0c;直接对数据库进行操作的话&#xff0c;慧出问题的&#xff0c;所以一般都会做一个管理系统&#xff0c;让工作人员通过这个管理系统来对这个数据库进行增删改查微信小程序其实给我们提供了这样的能力了(也就是可以…

java go

熟练掌握java技术&#xff0c;对多线程、数据结构有清晰的认识&#xff1b; 熟悉MySQL/Oracle数据库&#xff0c;熟悉关系数据库应用设计开发&#xff1b; 熟悉Spring/MyBatis/Freemarker等一种或者多种框架&#xff1b; java基础扎实&#xff0c;熟练掌握目前主流的开源框架&a…