Douyu 0.6.1发布了,这是一个超乎您想象的Web框架
?
自从2009年11月份发布第一个原型版本后,(见这里)
时间一恍就过去了1年半,
这段时间主要忙于工作了(从事分布式数据访问、存储以及Web容器方面的工作),
所以douyu一直处于停滞状态,直到今年3月份开始才能将1/3的时间投入到上面。
最初的版本抛弃了Servlet/JSP规范,并且自已实现容器,这思路理论上是没有大的错的,
但是太新潮了,原有的技术积累不能充分使用,所以但凡追求稳定第一的产品都不敢贸然尝试。
因此,douyu的设计思路也跟着变了,努力的方向是:
尽量兼容现有技术、寻求一种更简单更有效的办法改进现有技术。
?
douyu 0.6.1往这个方向迈出了第一步,?
第一步主要关注Web层的东西,不涉及持久层,douyu 0.6.1包含了如下亮点:
?
1. 兼容Servlet/JSP,使用douyu提供的api写出的程序能部署到Servlet容器上(例如Tomcat、Jetty)
2. 基于Javac编译器技术,实现零配置,无需打包、部署,无需重启Servlet容器,直接运行Java源文件。
3. 支持Velocity、FreeMaker,集成其他模板引擎也是非常简单,多种模板引擎可以在同一个应用中同时使用。
4. 学习成本非常低,目前只需要学习5个接口(不超过15个方法)。
5. douyu 0.6.1源代码不超过1500行,所以非常适合初学者入门,如果想达到另一个境界,可以继续看Javac编译器的代码。
?
?
?
?
Douyu项目主页目前放在:?
http://code.google.com/p/douyu/?
?
?
以下是例子:?
(可以从发布包的douyu-examples\WEB-INF\src中找到这些例子)
?
?
Hello World?
?
??
?
??
?
??
?
最炫的功能:?
可以在JSP、Velocity、FreeMaker中直接访问控制器Action中的本地变量:?
?
现在真的想lz这样的研究技术的人太少了。真的佩服 53 楼 yin_bp 2011-06-03 引用异步Action
@Controller
public class AsyncTest {
public void asyncAction(HttpServletRequest request) {
哦,再请教两个问题:
1.douyu的控制器是不是只能有一个控制方法,如果允许多个方法的话,那么异步调用为每个方法请求公用一个线程池还是单个线程池。
2.douyu的异步action是每个action分派一个线程池,还是全部采用一个线程池
54 楼 ZHH2009 2011-06-04 <div class="quote_title">yin_bp 写道</div>
<div class="quote_div">
<br>douyu的控制器是不是只能有一个控制方法<br>
</div>
<p><br>一个控制器可以有多个action,所有的public方法(排除static方法)都是action,都可以通过"/包名/简单类名.方法名"这样的url访问。<br></p>
<div class="quote_title">yin_bp 写道</div>
<div class="quote_div">
<br>如果允许多个方法的话,那么异步调用为每个方法请求公用一个线程池还是单个线程池。<br>2.douyu的异步action是每个action分派一个线程池,还是全部采用一个线程池<br>
</div>
<p><br>首先要说明一点:<br><br><span style="color: #008000;">异步action是基于servlet3.0规范中的异步servlet实现的,</span><br><br>出现异步servlet的最根本原因是:<br><br>当请求处理逻辑走到业务代码时(通常是从进入javax.servlet.Servlet.service方法开始),<br>如果业务代码在执行一个很耗时的计算或者调用的服务很久都没结果导致一直在死等,<br>那么当前线程(正常来说是容器的内部线程)就不能往下走了,就被卡住了,<br>另外一个同样的请求进来时,容器又要用另外一个线程执行Servlet.service方法,在执行到这个业务代码时也被卡住了,<br>从而导致容器内部线程池一下就耗尽了,无法执行其他的Servlet。<br><br>异步servlet,就是为了解决这个问题,如果开发人员提前意识到业务代码可能把容器的内部线程卡住,<br>那么此时他就应该用异步servlet,这样这个Servlet.service方法就有可能在一次请求中被重复执行多次,<br>相当于容器有一个很大的循环,在不停的执行Servlet.service方法,<br>直到那个很耗时的计算完成或服务超时就可以结束请求。<br><br>所以不管是异步servlet还是异步action,这里说的线程池是容器内部的线程池。<br><br>当然,在使用异步servlet时,<br>一般来说应用开发人员都会为这些耗时的计算或者可能会出现问题的服务建立一个公用的业务线程池,<br>但是这个业务线程池并不是由容器来管理的,即使这个公用的业务线程池被耗尽了,<br>容器自己的线程池还是可以处理其他类型的请求。</p>
<p>?</p> 55 楼 yin_bp 2011-06-04 呵呵,解释的非常清楚,赞
不过,异步处理最大的挑战在于资源冲突、死锁以及超时处理等问题,综合考虑起来还是挺复杂的。 56 楼 sebatinsky 2011-06-08 呵呵,保留意见,不过还是支持开源洞洞 57 楼 windlike 2011-06-12 好,很好,very good