文档章节

Play源码深入之二:Play应用启动时框架的初始化

奋斗到天明
 奋斗到天明
发布于 2015/08/27 18:12
字数 528
阅读 419
收藏 0

接着 上篇在python的辅助下,理理输入启动命令之后,play框架进行的初始化工作。 application.py中的java_cmd方法中就有play.server.Server。

def java_cmd(self, java_args, cp_args=None, className='play.server.Server', args = None):

在这个类中可以看到亲切的main方法,就是框架的入口了。

public class Server {
    ...
    public static void main(String[] args) throws Exception {
        File root = new File(System.getProperty("application.path"));
        if (System.getProperty("precompiled", "false").equals("true")) {
            Play.usePrecompiled = true;
        }
        if (System.getProperty("writepid", "false").equals("true")) {
            writePID(root);
        }
        Play.init(root, System.getProperty("play.id", ""));
        if (System.getProperty("precompile") == null) {
            new Server(args);
        } else {
            Logger.info("Done.");
        }
    }
    ...
}

其中对play.Play:init()方法对框架进行了初始化,包括应用的状态、应用java代码、模板、路由的位置、cookie域名称等。

public class Play {
    ...
    public static void init(File root, String id) {
        ...
        // Main route file
        routes = appRoot.child("conf/routes");

        // Plugin route files
        modulesRoutes = new HashMap<String, VirtualFile>(16);

        // Load modules
        loadModules(appRoot);

        // Load the templates from the framework after the one from the modules
        templatesPath.add(VirtualFile.open(new File(frameworkPath, "framework/templates")));

        // Enable a first classloader
        classloader = new ApplicationClassloader();

        // Fix ctxPath
        if ("/".equals(Play.ctxPath)) {
            Play.ctxPath = "";
        }

        // Default cookie domain
        Http.Cookie.defaultDomain = configuration.getProperty("application.defaultCookieDomain", null);
        if (Http.Cookie.defaultDomain!=null) {
            Logger.info("Using default cookie domain: " + Http.Cookie.defaultDomain);
        }

        // Plugins
        pluginCollection.loadPlugins();
        ...
    }
    ...
}

其中最关键的是对play插件的读入。play.plugins.PluginCollection:loadPlugins()方法,play的应用每个事件,如应用启动、访问到达、访问结束、代码变动、应用停止等等,都会逐一交给各个插件处理。 在play源码中已经定义一些plugins,并有顺序。

0:play.CorePlugin
100:play.data.parsing.TempFilePlugin
200:play.data.validation.ValidationPlugin
300:play.db.DBPlugin
400:play.db.jpa.JPAPlugin
450:play.db.Evolutions
500:play.i18n.MessagesPlugin
600:play.libs.WS
700:play.jobs.JobsPlugin
100000:play.plugins.ConfigurablePluginDisablingPlugin

我们也可以定义自己的Plugins继承PlayPlugins,然后在应用app目录下如框架中一样,建立play.plugins文件,就也能接受play事件的推送了。

屏幕快照 2015-07-28 10.08.53 AM 

在Server的构造方法中,准备一些netty启动需要的参数之后,就开启了netty,其中重要的是 设定了HttpServerPipelineFactory

public class Server {
    ...
    public Server(String[] args) {
       ...
        ServerBootstrap bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(
                Executors.newCachedThreadPool(), Executors.newCachedThreadPool())
        );
        try {
            if (httpPort != -1) {
                bootstrap.setPipelineFactory(new HttpServerPipelineFactory());

                bootstrap.bind(new InetSocketAddress(address, httpPort));
                bootstrap.setOption("child.tcpNoDelay", true);
       ...
    }
    ...
}

当第一次访问到时,netty将请求转到play.server.HttpServerPipelineFactory中。其中配置了play.server.PlayHandler处理类。netty会用PlayHandler来处理请求。

private String pipelineConfig = Play.configuration.getProperty("play.netty.pipeline", "play.server.FlashPolicyHandler,org.jboss.netty.handler.codec.http.HttpRequestDecoder,play.server.StreamChunkAggregator,org.jboss.netty.handler.codec.http.HttpResponseEncoder,org.jboss.netty.handler.stream.ChunkedWriteHandler,play.server.PlayHandler");

在往后,就进入了下一篇文章。

© 著作权归作者所有

共有 人打赏支持
奋斗到天明
粉丝 18
博文 112
码字总数 82707
作品 0
昌平
程序员
Play源码解析计划

最近有想法看看Play的源码,以提高自己的编码水平。之前都是东看看,西看看。最后看来去却好像无所大成。有人说过,伤敌十指,不如断敌一指,于是我有开始了学习之路。 原计划是采用1.2.3版本...

刀狂剑痴
2015/08/27
143
0
Play源码深入之七:Play的MVC实现

整体来说,Play1.x是一个较完善的框架,各种功能都一应俱全,有点像句老话“麻雀虽小五脏俱全”哈。虽没有Struts、SpringMVC的大名气,但是使用起来,相当顺手。本文将深入Play1.x的MVC,也整...

刀狂剑痴
2015/08/27
700
0
在 Scala IDE 2.0 中设置和使用 Play Framework 2.0

本文将向你介绍如何在 Scala IDE 开发环境中设置并开始使用 Play Framework 2.0 . 前提要求 Eclipse 3.6.2 (Helios) 并安装好 Scala IDE for Scala 2.9 插件 (update site: http://download....

红薯
2012/02/17
3.3K
3
Play 1.x框架学习之一:功能测试 (functional test in play framework)

Play框架中已经集成了junit框架,大家可以非常方便的进行功能测试,这里我展现一个测试新增的例子,其他的大家可以照这个例子深入。 首先需要在app/modules包中定义一个Beat类,app/control...

奋斗到天明
2015/08/27
0
0
【PLAY FrameWork】PLAY框架快速入门

前言 目前,Ruby on Rails及Grails等动态脚本语言正发展得如火如荼,而在以Java为首的开源最大阵营中,也出现了各种框架。其中最著名的就是Play框架(http://download.playframework.org)。 ...

磊神Ray
2012/02/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

df和du命令 磁盘分区

9月25日任务 4.1 df命令 4.2 du命令 4.3/4.4 磁盘分区 df 命令 查看系统磁盘空间使用情况 常用参数 -h (human-readble) # 人性化的为空间大小转换单位显示[root@centos7 ~]# df -h文件系...

robertt15
14分钟前
0
0
【a&sAI创新】华为CloudIVS轻量云:借力打力,四两拨千斤

[摘要] 1、测评表现就目前来说,AI的门槛还是比较高的,业内所熟知的算法企业,为了追求算法的极致,比如人脸识别公司,仍在不断扩大研发...   1、测评表现   就目前来说,AI的门槛还是比...

yizhichao
31分钟前
1
0
安卓安装APK报错error: INSTALL_FAILED_UPDATE_INCOMPATIBLE

记录一个 DELETE_FAILED_INTERNAL_ERROR Error while Installing APK问题 之前遇到这个问题 方案1 将data/data/目录下该应用的包名的目录删除掉,如:adb shell rm -rf data/data/com.demo.h...

切切歆语
31分钟前
0
0
用网关zuul时,熔断hytrix里面的坑

1,zuul 默认的隔离级别是信号量,默认最大隔离信号量是100 信号量隔离和线程池隔离的区别如下: https://my.oschina.net/u/867417/blog/2120713 默认设置: 2,zuul里隔离是按服务隔离的,也...

爱吃大肉包
32分钟前
0
0
使用SSM+Solr优雅的实现电商项目中的搜索功能

在学习了Redis&Spring-Data-Redis入门和Solr&Spring-Data-Solr入门后,接下来就该是项目实战了。这次我们用Vue.JS和ElementUI写前端页面,优雅的整合SSM-Shiro-Redis-Solr框架。 手摸手教你优...

TyCoding
32分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部