paoding-rose portal的实现技术,解析rose portal内部机制
2015-07-09 19:21
260 查看
内容
这个wiki主要介绍rose portal的实现技术,解析rose portal内部机制。妄语
我认为roes portal技术,是一个亮点,在实现上是独创。rose portal是一个服务端portal技术,而非客户端技术。所谓服务端portal技术,是指所有工作发生在服务器上,客户端在整个过程中没有任何作用,使用rose portal不需要任何js技术的支持。
使用rose portal,您可以将一个页面切成互不相关的多个子模块(我们称之为"window"),如果和配置组件结合,您可以根据根据不同用户的选择为之选择不同的模板以及窗口。
虽然rose portal不依赖前端技术,但你也可以通过和前端技术的结合实现"rose pipe"技术,所谓rose pipe借助了rose portal,不仅仅能够加快了服务器的执行速度,更是降低了页面的渲染和传输等待时间。
关于rose pipe技术及其实现,详见 《RosePipe》
开发概述
rose portal是rose扩展开的一种重要技术,从某种角度其光耀甚至超过作为它基础的rose。我们尽量把复杂和创意封装在实现代码中,暴露出来的api是极其简约的。如同 《第一支portal程序》 所述的那样,开发一个portal程序,你只需要把Portal参数声明在方法上,并在方法中调用portal.addWindow就完成了整个代码结构。这就是和普通rose唯一不同的地方,剩下就都一样了。
技术决策
本节简单介绍rose portal的技术方向决策,规范、统领技术的实现。转发
servlet容器能够将一个请求从某一个地址转到另外的地址,由转发后的地址实际处理该请求。rose portal利用了这个特性。rose portal在处理window请求时,本质使用forward来实现。和普通的web请求不一样的地方是,所有window的请求都是由同一个起点地址(主控控制器)开始转发,而非由由一个它转发给一个window,然后在由该window转发给下一个window。并发
主控制器把请求转发给不同的window并不是串行的,即不是等某个window执行完毕后,再由主控制器转发给下一个window。rose portal在此作了特别处理,每当您调用portal.addWindow时,就意味着转发已经开始,但是这个转发是由另外的thread来执行的(称为异步)。portal.addWindow并不wait,而是立即返回,所以当您调用多次addWindow时,可能意味着由多少个thread在为你同时执行(如果线程池线程充足)。线程池
web容器本身提供了一个线程池,用于处理容器接收到的用户请求。rose portal框架下的主控是由这个线程池的线程执行的,但对于window控制器却非如此。rose portal另行依赖于独立容器线程池之外java.util.concurrent.ExecutorService服务,并把window的执行交由这个执行服务来执行。在具体实现上,使用的是java.util.concurrent.ThreadPoolExecutor,这个执行服务提供了一个线程池的策略。
输出
作为一个服务端portal框架,无论服务端如何并行、甚至是“乱序”的并行,但是给用户的html或者其它的输出必须是一定的,和并行的调度无关的!rose portal要把每个window的输出独立出来,window执行服务可以和普通控制器那样合并数据到模板并调用out.println“输出”,但是不可以真的由window自己决定向客户端输出!真正的输出必须由主控线程来统一控制。
rose portal目前采用的是window自行缓冲页面内容,并由主线程来负责实际输出的形式。
技术实现关键组件
技术难点
如何使web容器在并发转发下不会出错?各个window如何进行独立输出?
主线程和并发的window线程的交互以及结果合并。
以上转载自https://code.google.com/p/paoding-rose/wiki/Rose_Portal_Inside
相关文章推荐
- Node.js学习笔记 02 Implementing flow control
- STM32 模拟I2C (STM32F051)
- Android调用invalidate(),控件不进行重绘画
- 解决INSTALL_FAILED_MISSING_SHARED_LIBRARY方法汇总主帖
- Javascript对象使用
- Socket.IO 和 Node.js 入门(转)
- 使用 symbolicatecrash 解析崩溃堆栈
- 浅谈凸优化问题中的Bregman迭代算法
- 小胖学PHP总结3-----PHP的循环语句
- mybatis学习
- LeetCode Climbing Stairs
- 有道词典
- Bacula安装(linux上)
- 【IDA*】 HDOJ 1667 The Rotation Game
- Eclipse中和编辑相关的快捷键
- [LeetCode] Longest Common Prefix
- 【iOS开发系列】地图与定位
- 报错:未能加载文件或程序集“XXX”或它的某一个依赖项。系统找不到指定的文件
- VC 弹出CDRom
- 银行家算法实例