webx已经开源了,一些东东也贴到这里备份下。
rundata生命周期
rundata构建于doGet方法执行的最初,在pipeline中的finally valves之前commit。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ... try { //在doGet的最初构造rundata,在rundata构造之后才会去走pipeline的流程 rundata = getRunData(request, response); if (!rundata.isRedirected()) { try { Profiler.enter("before request"); beforeRequest(rundata); } finally { Profiler.release(); beforeRequestCalled = true; } try { Profiler.enter("handle request"); handleRequest(rundata); } finally { Profiler.release(); } } } }catch (Throwable e) { ... } finally { try { //最后在finally中调用commit方法 commitRunData(rundata); } catch (Exception e) { ... } finally { if (beforeRequestCalled) { try { Profiler.enter("after request"); //考虑到不要让pipeline最后的清理操作影响到rundata内部需要提交的值,所以把这个放在rundata提交之后 afterRequest(rundata); } catch (RuntimeException e) { ... } catch (Error e) { ... } finally { Profiler.release(); } } } }
rundata的装饰模式
为了能够增强rundata的功能,对其中的request和response进行一层层的包装,将需要的功能一部分一部分的集成进去,就是rundata现在的处理方式。
<service name="RunDataService" class="com.alibaba.webx.service.rundata.DefaultRunDataService"> <property name="rundata.class" value="com.alibaba.china.common.webx.service.rundata.ChinaRunData" /> <property name="request.buffered.class" value="com.alibaba.webx.request.context.buffered.BufferedRequestContextFactory" /> <property name="request.lazycommit.class" value="com.alibaba.webx.request.context.lazycommit.LazyCommitRequestContextFactory" /> <property name="request.parser.class" value="com.alibaba.webx.request.context.parser