`
pikachu
  • 浏览: 120068 次
社区版块
存档分类
最新评论

Liferay 4.2 reverse ajax探索

阅读更多

为了使用Liferay中的chat功能,除了要建立一台jabber server之外,还需要启动两个属性
jabber.xmpp.server.enabled=true
reverse.ajax.enabled=true

jabber.xmpp.server.enabled比较好理解,reverse.ajax.enabled是什么?

在Liferay 4.2的chat有个特点。即使用户没有chat portlet的权限,当有其他人员向其发送chat消息时,会立即弹出一个chat消息框。

该消息框的实现就是用了reverse ajax。我们可以trace一下liferay的代码看看这个自动弹出的chatbox是如何实现的。

首先找到ajax.js
找到里面有

request: function() {
...
onComplete: ReverseAjax.response,
...
},

response: function(xmlHttpRequest) {
...
ReverseAjax.request();
...
},

写过点ajax的朋友都能猜出来,这两段是干什么的。一旦一个ajax请求发起,如果正常结束,那么在responnse方法中重新再发起一次请求。

吓人一跳,liferay不会那么没效率吧,当中都没有个延迟??

再找java代码ReverseAjaxAction.java 在不起眼的代码中,有这么一行
reqWait.waitForRequest();看看waitForRequest的定义

public synchronized void waitForRequest() throws InterruptedException {
int heartbeatCycle = GetterUtil.getInteger(PropsUtil.get(
PropsUtil.REVERSE_AJAX_HEARTBEAT));

_timedOut = true;

wait(heartbeatCycle);
}

大有玄机!!找找notify是被谁调用的代码......
BinGo!!
RosterUpdateListener和MessageListener中有reqWait.notifyWait()

让我们重新理一下思路
两条主线
ajax.js中ReverseAjax.request()->ReverseAjaxAction.java->reqWait.waitForRequest()
RosterUpdateListener|MessageListener->reqWait.notifyWait()

在浏览器中一直有一个请求,但是当请求到服务端端时,被java阻塞了。
当有jabber消息返回时,则会notify前一个被阻塞的线程,最终使得浏览器端的ajax代码将chatbox显示出来。

最终,我们得出一个结论,liferay 中ReverseAjax是用poll来模拟push。但是poll过程中利用了java线程同步的技巧。

当然以上的分析还很粗糙。没有解释线程同步之间的资源和超时的设计,本文就算起个抛砖引玉的作用吧。

分享到:
评论
5 楼 pikachu 2007-03-25  
lyo 写道
多谢回复! 等于说liferay也没有解决客户端不停的向服务器发送请求的问题,服务器的访问量仍然是很大的。 不过看 gmail的talk实现应该有其他方法,否则google的服务器撑不住的。


从网上找到的少得可怜的资料看,gmail talk也是类似的实现
http://www.cnblogs.com/cathsfz/archive/2006/10/22/536454.html
Liferay同传统web chat相比的一个改进是在与服务端会把一次数据请求先block一段时间。如果这段时间内有数据,则马上返回,如果没数据则等待到超时后再返回。

这样做的好处是避免客户端的快速请求,因为每次空数据都会被block一段时间。这样降低了客户端和服务器的一部分资源。但是问题是单次请求所占服务器端口的时间较长,单服务器并发的用户数不能过大。不过web chat都会占用大量端口,区别在于每次请求的占用时间。即使单次时间短,如果请求非常频繁,并发用户数也大不了哪去。


说实话,我觉得在http协议下要模拟服务器的推模型几乎没有什么更好的方法了。

至于Google,火星人都知道他是一个服务器群。你要是硬件投资上去,Liferay也可以做成集群的。
4 楼 lyo 2007-03-24  
多谢回复! 等于说liferay也没有解决客户端不停的向服务器发送请求的问题,服务器的访问量仍然是很大的。 不过看 gmail的talk实现应该有其他方法,否则google的服务器撑不住的。
3 楼 pikachu 2007-03-14  
re lyo:
在浏览器中一直有一个请求,但是当请求到服务端端时,被java阻塞了。随后这个线程一直在wait状态。

之后当jabber的线程获得一个消息,则会调用RosterUpdateListener或者MessageListener,这两个Listener会调用notifyWait,这个notifyWait会解除浏览器请求的线程的阻塞。

re chenqj:
ReverseAjax.request()有超时。
在http环境下,除了"不断的访问服务器"还有其他方法么?
2 楼 chenqj 2007-03-13  
ReverseAjax.request()难道不会超时么?
这样不断的访问服务器效率有问题吧
1 楼 lyo 2007-03-13  
分析的不错 
"当有jabber消息返回时,则会notify前一个被阻塞的线程" 这句能具体解释一下吗,谢谢

相关推荐

    Liferay 4.2 和Openfire的组合使用

    **标题:“Liferay 4.2 和Openfire的组合使用”** 在IT行业中,集成不同的软件和服务以构建高效的企业级解决方案是一项常见的任务。本话题主要关注如何将Liferay Portal 4.2与Openfire即时通讯服务器相结合,以提供...

    LIFERAY4.2.0版配置

    在本文中,我们将深入探讨如何配置Liferay 4.2.0版本,这是一个知名的开源企业级门户平台。根据描述,虽然官方文档可能是针对4.3.5版本的,但据称4.2.0版本与之仅有微小差异。我们将重点关注如何在Eclipse集成环境中...

    Liferay ajax

    在Liferay 6中,使用Ajax技术来处理Portlet请求是一种常见的优化用户交互的方法。Ajax(Asynchronous JavaScript and XML)允许部分页面更新,无需整个门户页面的刷新,从而提升了用户体验,尤其是在Portlet环境下。...

    liferay ajax DEMO

    使用liferay框开发ajax 的Demo

    基于serverResource方式的liferay中ajax方式的的实现

    本文将深入探讨“基于serverResource方式的Liferay中Ajax方式的实现”,结合提供的标签“源码”和“工具”,我们将讨论如何利用Liferay的API和Ajax技术来创建动态交互的Web页面。 在Liferay中,serverResource是一...

    Liferay开发指南

    环境搭建 一、资源准备 以上资源内容可以在Liferay的官方网站下载, 1 liferay-plugins-sdk-6.1.1...经过上面的三步,在Liferay IDE(Eclipse 4.2)的下方的server面板处,可以看到Liferay 6.1 CE Server,现在点击运行

    Liferay Portal Liferay IDE

    Liferay Portal Liferay IDE

    liferay详细讲解 liferay项目完全讲解

    Liferay是一款开源的企业级门户平台,它提供了丰富的功能和高度可定制性,广泛应用于构建企业网站、内部系统、协作平台等。在这个“liferay详细讲解 liferay项目完全讲解”的资料包中,我们可以期待深入了解到关于...

    liferay环境的搭建

    ### Liferay环境搭建详解 #### 一、简介 Liferay是一款功能强大的开源企业级门户平台,主要用于...掌握这些基本操作后,您可以进一步探索Liferay的高级特性,如主题开发、服务构建等。希望本文档对您的学习有所帮助!

    liferay扩展环境 liferay ext

    标题 "Liferay扩展环境 Liferay Ext" 涉及到的是Liferay门户平台的一个关键概念,Liferay Ext是用于扩展和定制Liferay功能的核心工具。Liferay是一个开源的企业级内容管理平台,它允许用户根据需求构建自定义的数字...

    liferay快速入门quickstart

    ### Liferay快速入门知识点详解 #### 一、Liferay Portal简介与快速启动 ...无论是对于希望快速搭建企业门户的用户,还是想要深入探索Liferay开发的开发者,这份快速入门指南都是一个不可或缺的资源。

    liferay 资料

    - 它的界面设计是基于 Web 服务的,允许通过 Ajax 技术实现动态交互。 2. **portlet 开发**: - Portlet 是 Liferay 中的基本组件,它可以是一个网页、应用程序或内容的展示单元。 - Liferay 支持多种portlet ...

    Liferay6.0开发指南

    - **JavaScript/Ajax**:前端交互。 - **HTML/CSS**:页面布局和样式。 - **XML**:配置文件等。 ##### 3. 扩展与定制 Liferay 6.0 提供了丰富的扩展和定制选项: - **主题定制**:通过创建自定义主题来改变门户...

    liferay的开发文档

    开发者将学习到如何处理portlet的事件、配置参数,以及如何利用Ajax增强portlet的交互性。同时,文档还会讨论portlet的安全性和性能优化策略,确保portlet在生产环境中的稳定运行。 文档三:《Liferay Theme ...

    LIFERAY的ppt课件

    7. **集成与API**:探索Liferay的API和Service Builder,了解如何与其他系统进行集成。 8. **扩展与插件**:了解Marketplace中的可用插件,以及如何开发自己的插件来扩展Liferay的功能。 **最佳实践** 在使用...

    Liferay 6 入门教程

    【Liferay 6 入门教程】 Liferay是一款开源的企业级门户平台,广泛用于构建企业网站、社交网络和协作工具。Liferay 6是其一个重要的版本,提供了丰富的功能和改进,包括更好的用户体验、增强的社区参与度以及更强大...

Global site tag (gtag.js) - Google Analytics